算法图解
看到一点东西记下来自己写一遍增强记忆,哎,年纪大了,没过多久就容易忘.
之前一直都是用Typora和notepad++记笔记,攒了好多,想来想去上传上来以后方便找些.
言归正传.
常见大O运行时间排序:O(logn)<O(n)<O(n*logn)<O(n²)<O(n!)
.
大O表示法不考虑(+ - x /)数字.如:O(n/26)需要表示为O(n).
链表中的元素可以储存在内存中的任何地方,每个元素都储存了下一个元素的地址,从而使一系列随机内存串在一起.
元素的位置称为索引
,通常从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的变量
由于每个函数都要占用一定的内存,如果栈很高,就意味着计算机存储了大量调用的信息,占用内存.
若递归函数一直运行,栈将不断增大,每个程序可使用的栈空间有限,程序用完空间后,将因栈溢出而终止.