时间复杂度:用来评估算法运行效率的一个式子
空间复杂度:用来评估算法内存占用大小的式子
O(logn):递归折半
常见的时间复杂度
O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^2*logn)<O(n^3)
复杂问题的时间复杂度
O(n!)
O(2^n)
O(n^n)
如何快速判断时间复杂度(适合绝大多数简单情况)
1、确定问题规模
2、循环减半过程--->logn
3、k层关于n的循环 n^k
时间往往比空间更重要:空间换时间
递归的两个特点:
调用自身
结束条件
汉诺塔问题;
2个-->三次
A-------->C
1、把n-1个盘子从A经过C移动到B
2、把第n个盘子从A移动到C
3、把n-1个盘子从B经过A移动到C
# h(n)=2h(n-1)+1
def hanoi(n, a, b, c):
if n:
hanoi(n - 1, a, c, b)
print('moving from %s to %s' % (a, c))
hanoi(n - 1, b, a, c)
hanoi(3, 'A', 'B', 'C')
顺序查找:for循环
列表的index()就是顺序查找
二分查找:
# O(logn)
def binary_search(val, li=[]):
left = 0
right = li.__len__() - 1
while left <= right:
mid = (left + right) // 2
if li[mid] == val:
return mid
elif li[mid] > val:
right = mid - 1
else:
left = mid + 1
return None
li = [i for i in range(10)]
print(binary_search(4, li))
排序:将一组无序的记录序列调整为有序的记录序列
列表排序
内置函数sort()
结合了归并排序和插入排序,做了一些优化
java内置的排序也改了(快排--->归并),如果看官方文档的话 ,会有stable (steibou)