算法
时间复杂度:用来评估算法运行效率的一个式子
空间复杂度:用来评估算法内存占用大小的式子
更多的算法例子:https://github.com/ls-2018/book
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)