废话时间:python
算法其实是高于语言的。 因此我是第一!!! 好比说你的列表.sort 它里面其实就是实现了一种算法。 算法:一个计算过程,解决问题的方法。 程序 = 数据结构 + 算法。
光年是距离。
通常来讲:时间复杂度高的算法比复杂度低的算法慢。算法
问题规模基本上差很少同样的时候。即n缓存
与机器有关。数据结构
时间复杂度是独立于机器的。函数
o(1) < o(logn) < o(n) < o(nlogn) < o(n的平方) < o(n平方logn) < o(n的三次方)
如何简单判断时间复杂度?code
最好是根据运行过程来估计 找到表明问题规模的n 魑魅魍魉chi‘mei’wang‘liang
是否有循环减半的过程 -> o(logn) 几层循环就是n的几回方的复杂度
用来评估算法内存占用大小的一个式子
空间换时间排序
例如:若是你想让你的算法快点,就须要更多的缓存。
递归的两个特色: - 调用自身 - 结束条件 def qq(n): if n == 0 : print('个人小可爱',end='') else: print('抱着',end='') qq(n-1) print('的我',end='') qq(5) # 抱着抱着抱着抱着抱着个人小可爱的个人个人个人个人我 def fun(x): if x > 0: print(x) fun(x-1) def func(x): if x > 0: func(x-1)
当n个盘子时,把n-1看作一部分。 1. 把n-1个圆盘从a通过c移动到b 2. 把第n个圆盘从a移动到c 3. 把n-1个圆盘从b通过a移动到c
t = 0 def hanoi(n,a,b,c): global t if n > 0: hanoi(n-1,a,c,b) t +=1 print(':moving from %s --> %s.'%(a,c)) hanoi(n-1,b,a,c) hanoi(5,'a','b','c') print('本次总共运行 %s 次'%t)
汉诺塔移动次数的递推式:h(x) = 2h(x-1)+1
3.1 列表查找:从列表中查找指定元素 - 输入:列表、待查找元素 - 输出:元素下标或未查找到元素 3.2 顺序查找 - 从列表第一个元素开始,顺序进行搜索,直到找到为止。 3.3 二分查找 - 从有序列表的候选区data[0:n]开始,经过对待查找的值和候选区中间值的比较,可使候选区减小一半。
def erfen_search(li,val): low = 0 high= len(li) - 1 while low<=high: mid = (low+high) // 2 if li[mid] == val: return mid elif li[mid] < val: low = mid + 1 else: high = mid - 1 a = erfen_search([1,2,3,4.123,123,12,3,12,3,12,3,21,3,213,21,321,3,213,21,321,3,21,4,3,543,53,45,435,342,5],435) # 上面这个方法有问题,不信你试。 # 递归版本二分查找 def bin_search_rec(data_set,value,low,high): if low <= high: mid = (low + high) // 2 if data_set[mid] == value: return mid elif data_set[mid] < value: low = mid + 1 return bin_search_rec(data_set,value,low,high) else: high = mid - 1 return bin_search_rec(data_set,value,low,high) else: return
- 列表排序 - 将无序列表变为有序列表。 .sort - 应用场景 - 各类榜单 - 各类表格 - 给二分查找用 - 给其余算法用 输入:无序列表 输出:有序列表 排序Low B三人组 - 冒泡排序 - 插入排序 - 选择排序 算法关键点: - 有序区 - 无序区 升序与降序 排序凶凶组: - 快排 - 思路: - 取一个元素p(第一个元素),使元素p归位; - 列表被p分红两部分,左边逗比p小,右边逗比p大‘ - 递归完成排序。 递归终止条件:列表剩一个元素。 - 算法关键点:1. 归位 2. 递归 - 堆排 - 归并排序 没什么人用的排序: - 基数排序 - 希尔排序 - 桶排序
执行次数函数 | 阶 | 非正式术语 |
---|---|---|
12 | O(1) | 常数阶 |
2n+3 | O(n) | 线性阶 |
3n²+2n+1 | O(n²) | 平方阶 |
5log2n + 20 | O(logn) | 对数阶 |
2n + 3nlog2n + 19 | O(nlogn) | nlogn阶 |
6n³ + 2n² + 3n +4 | O(n³) | 立方阶 |
2" | O(2") | 指数阶 |