1.算法
1.1时间复杂度
时间复杂度:用来评估算法运行效率的一个式子!
由于print()一次与print多次,执行时间相差很小,所以时间复杂度统一为O(1)。
相对于循环来说,中间执行的代码时间相对来说很小,所以只要是循环,时间复杂度只与循环的次数有关。
小节:
1.时间复杂度是用来估计算法运行时间的一个式子。
2.一般来说,时间复杂度高的算法比复杂度低的算法慢。
3.常见的时间复杂度效率
O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<O(n2logn)<O(n3)
4.复杂的时间复杂度
O(n!) O(2n) O(nn) …
快速判断算法复杂度规模(适用于大多数情况):
1.没有循环,为O(1)
2.循环n次,为O(n)
3.k层循环,为n^k
4.循环减半,为log2^n
复杂情况,根据算法执行过程判断
1.2空间复杂度
空间复杂度:用来评估算法内存占用大小的式子。
1.算法只是使用了一些变量,空间复杂度为O(1)。
2.算法使用了长度为n的一维列表,空间复杂度为O(n)。
3.算法使用了m行n列的二维列表,空间复杂度为O(m*n)
在实际编程中,我们都会以空间来换取时间,即使占用内存,也要争取速度。
2.递归
2.1常见例子
2.2汉诺塔问题
要求把所有圆盘从A上挪到另一个柱子上
小圆盘不能放在大圆盘上
一次只能移动一个盘子
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def hanio(n,a,b,c):
if n>0:
hanio(n-1,a,c,b)
print("from %s to %s"%(a,c))
hanio(n-1,b,a,c)
hanio(3,"A", "B", "C")
汉诺塔移动次数的递推式:h(x)=2h(x-1)+1
2.列表查找
2.1顺序查找
顺序查找:也叫线性查找,从列表第一个元素开始,顺序搜索,直到找到元素或搜索到最后一个元素。
时间复杂度为O(n)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def search(li,val):
for index, v in enumerate(li):
if v == val:
return index
return None
index = search([1,2,4,5,9,3], 4)
print(index) # 2
2.2二分法查找
⼆分查找:⼜叫折半查找,从有序列表的初始候选区li[0:n]开
始,通过对待查找的值与候选区中间值的⽐较,可以使候选
区减少⼀半。
时间复杂度:O(logn)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
def search(li,val):
length = len(li)
min = 0
max = length - 1
while min <= max:
mid = (min + max)//2
if li[mid] == val:
return mid
elif li[mid] > val:
max = mid -1
elif li[mid] < val:
min = mid + 1
return None
index = search([1,2,4,5,9], 4)
print(index) # 2
2.3
来源:https://blog.51cto.com/10983441/2435622