算法简介
算法的速度指的并非时间,而是操作数的增速
操作 | 数组 | 链表 | 散列表(平均) | 最糟 | 二叉查找树 |
---|---|---|---|---|---|
读取 | O(1) | O(n) | O(1) | O(n) | O(logn) |
插入 | O(n) | O(1) | O(1) | O(n) | O(logn) |
删除 | O(n) | O(1) | O(1) | O(n) | O(logn) |
选择排序
O(n^2),本来是,但通常忽略常数
递归
- 基线条件(使其不再调用自己)
- 递归条件
调用栈(用于存储多个函数的)-所用函数调用都进入调用栈
栈操作:压入和弹出
二分查找的递归条件:binary_search_basic(list,target,low,high)
基线条件:low > high
快速排序
分而治之(D&C)将问题逐步分解,处理列表的基线条件可能为空数组或仅一元素
quicksort(less) + [pivot] + quicksort(greater)
less:[i for i in array[1:] if i <= pivot]
基线:len(array) < 2
散列表
散列函数(将输入映射到数字),如果两个键映射到了同一个位置,就在这个位置存储一个链表
散列表(hash table)-缓存
一旦装填因子超过0.7,就该调整散列表的长度
广度优先搜索
BFS:找到两样东西之间的最短距离
总时长O(V+E),V是顶点,E是边数
图由节点和边组成
队列操作:入队和出队
队列是FIFO:先进先出,而栈是LIFO:后进先出
狄克斯特拉算法
找出最快的路径,边引入权重(非负),仅适用于有向无环图
流程:首先找到最低节点更新其邻居,其次找次低节点,直到结束
贪婪算法
每步都采取最优的做法,找到近似解
寻找局部最优解,企图以此获得全局最优解
动态规划
从小问题(需离散,互不依赖)着手,逐步解决大问题
CELL[i][j] = 两者中较大的哪个
- 上一个单元格的值(即CELL[i-1][j]的值)
- 当前商品的价值 + 剩余空间的价值(CELL[i-1][j-当前商品重量])
K最邻近算法
分类和回归,毕达哥拉斯公式
接下来如何做
二叉查找树,对于其中的每个节点,左子节点的值都比它小,而右子节点的值都比它大