算法图解

看到一点东西记下来自己写一遍增强记忆,哎,年纪大了,没过多久就容易忘.

之前一直都是用Typora和notepad++记笔记,攒了好多,想来想去上传上来以后方便找些.

言归正传.


 


 

第一章-算法简介

1.3 大O表示法

算法运行时间是从其增速的角度度量的,并不以秒为单位.

常见大O运行时间排序:O(logn)<O(n)<O(n*logn)<O(n²)<O(n!).

大O表示法不考虑(+ - x /)数字.如:O(n/26)需要表示为O(n).

第二章-选择排序

2.2数组和链表

链表中的元素可以储存在内存中的任何地方,每个元素都储存了下一个元素的地址,从而使一系列随机内存串在一起.

元素的位置称为索引,通常从0开始.

数组和链表运行时间

      数组     链表

读取   O(1)   O(n)   数组读取速度快,插入速度慢

插入   O(n)   O(1)   链表读取速度慢,插入速度快

删除   O(n)   O(1)   仅当能够立即访问要删除的元素时,删除操作运行时间才为O(1)

数组插入后每次都需要重新排序;如果没有足够的空间,插入失败,可能还得将整个数组复制到其他地方.

在同一个数组中,所有元素的类型都必须相同(都是int,或double等)

链表删除元素只需要修改前一个元素指向地址即可,数组则需要将后面所有元素都向前移.

访问方式:

数组支持 : 随机访问 和 顺序访问

链表支持 : 顺序访问

2.3选择排序

第一次需要检查元素n个,随后一次为n-1,n-2,...,2,1.平均每次检查元素数为1/2 *n,因此运行时间为O(nx1/2xn).但大O表示法省略1/2这样的常数,所以简写为O(n²)

 1 def findSmallest(arr):
 2     smallest = arr[0]
 3     smallest_index = 0
 4     for i in range(1, len(arr)):
 5         if arr[i]  < smallest:
 6             smallest = arr[i]
 7             smallest_index = i
 8     return smallest_index
 9     
10 def selsctionSort(arr):
11     newArr = []
12     for i in range(len(arr)):
13         smallest = findSmallest(arr)            #返回得到的是arr的索引
14         a = arr.pop(smallest)                   #a等于arr删除的元素
15         #a = arr.remove(smallest)               #remove没有返回值,此处不能使用它删除
16         print(a)
17         newArr.append(a)
18         print(newArr)
19     return newArr
20 21 print(selsctionSort([5, 3, 6, 2, 10]))          #打印[2, 3, 5, 6, 10]

 

第三章-递归

3.1递归

递归只是让解决方案更清晰,并没有性能上的优势.实际上,有的时候循环的性能更好.

递归函数:

基线条件:避免函数进入死循环,使函数不再调用自己.

递归条件:函数调用自己


1 def countdown():
2     print(i)
3     if i <=1:               #基线条件
4         return
5     else:
6         countdown(i-1)      #递归条件

 

3.3栈

  • 3.3.1调用栈

 1 def count(num):
 2     print(num)
 3     square(num)
 4     print(num+1)
 5     
 6 def square(num):
 7     print(num*num)
 8   
 9 count(3)   
10 #count(3)-->print(3)-->square(3)-->print(3*3)-->print(3+1)

 

调用count函数,计算机为其分配一块内存.将内容储存在内存中.再调用square函数,也为其分配一块内存.

计算机使用一个栈来表示这些内存块,新生成位于之前生成的上面.执行完一个,相应的内存块被弹出.

这个栈存储多个函数变量被称为调用栈.

  • 3.3.2递归调用栈

1 def fact(x):
2     if x ==1:
3         return 1
4     else:
5         return x * fact(x-1)
6 fact(3)
7 #3*2*1

递归里面需使用return,每次递归调用需要接收到返回值

每个fact调用都有自己的x变量.在一个函数调用中不能访问另一个x的变量

由于每个函数都要占用一定的内存,如果栈很高,就意味着计算机存储了大量调用的信息,占用内存.

若递归函数一直运行,栈将不断增大,每个程序可使用的栈空间有限,程序用完空间后,将因栈溢出而终止.

 

 

posted @ 2019-01-02 20:04  Pinocchio0-0  阅读(139)  评论(0编辑  收藏  举报