总结:by Seven
本文为数据结构和算法的知识总结,包括1,常见的数据结构(数组,链表,队列,栈,堆,树,图),2,算法思想(蛮力,减治分治转治,贪心,动态规划) 3,排序算法,4,字符串算法等方面。具体的知识点和算法见其他系列文章。
1.数据结构
底层实现:数组array, 链表list
常用数据结构:
-
数组: 储存元素的地址连续,根据下标查找(偏移寻址)快
-
链表: 地址不连续,增加删除元素快。
-
队列queue:先进先出,对于树的层序遍历和图的BFS可以使用该结构
-
栈stack:先进后出,对于图的DFS(深度优先遍历)可以使用该结构
-
堆(优先队列)heap:
-
优先队列,提供插入元素和删除最小元素,链表和二叉查找树都可以实现,但不是最好,堆实现最好
-
任意非终端节点的值不大于左节点和右节点为最小堆。
-
建堆方法1:O(n),全部放好,自底向上;
-
建堆方法2:O(NlogN),每插入一个元素,变化一次
-
删除最大元素:时间复杂度O(logN), 然后开始往下过滤.
-
插入一个元素:O(logN), 插入到最后,然后开始网上滤.
-
-
树
-
二叉树:
二叉树的前序 中序 后续遍历;
-
完全二叉树(应用:二叉堆):
-
二叉查找树:左子树<根节点<右子树
-
平衡二叉查找树:
- AVL树:左右旋,两次旋转,每次插入旋转的复杂度:logN
- 红黑树:根节点是黑色,null是黑色,红节点的附近只能是黑色,单条路径上的黑色节点数量一样。保证了:如果黑色高度是n,则单条最短路线是n-1,最长路线是2(n-1).
- 伸展树:splay tree
-
2-3 tree:
- 2-3 trees and 2-3-4 trees are search trees that allow more than one item to be stored in a tree node.
-
-
图
-
图的表示
- adjacency list, adjacency table 邻接矩阵 邻接表
- Complexity: V+E,V*V (V为顶点数,E为边的数量)
-
图的遍历:
- 复杂度:n
- 深度优先遍历(先序遍历,栈或递归),
- 广度优先遍历(层序遍历,队列),
- 通过遍历判断图是否有环:判断是否有back edge.
-
图的拓扑排序:
-
统计所有点的入度,从入度为0开始循环调用,放入队列中。
-
深度遍历的栈实现,-
-
-
图的最小生成树:
-
Prime’s Algorithm。贪婪算法,
-
Kruskal’s Algorithm
-
-
图的最短路径:
- Djisterla算法:单原点到所有点的最短路径。单原点非循环正权重最短路径。
-
可达性和所有点对之间的最短距离
-
DP,3层for循环,以每个点作为垫脚石
if (e[i][k] && e[k][j]) { e[i][j] = true }
-
-
2.常见算法思想
-
蛮力
-
减治分治转治
- 减治:decrease and conquer, 将每个大问题减少为更小的问题,
- 分治:divide and conquer, 将每个大问题分为两个或以上更小的问题。
- 转治:transfer and conquer, 将大问题转化为其他问题解决,预先排序。
- 区别:
- 减治将一个问题转化为一个更小的问题,如二分查找法
- 分治将一个问题转化为多个更小的问题,如
-
贪心:总是认为当前是最好的,
- Prim算法: 图的最小生成树,
- 用一个数组记录所有点的到任意一个起始点的距离,初始值为无穷
- 初始化一个最小堆,将该数组放入
- 依次弹出最小堆的最小点,更新该点到邻接点的距离,在循环
- 图的djesterla 图的单源点最短路径
- 和Prim算法类似,
- 第三步更新该点到邻接点的距离为累加值
- Huffman encoding for data compression:
- 每次取频率最低的两个字母作为一个新的组合
- 根据概率为所有元素进行构造树编码,概率高的编码少,效率高。
- Prim算法: 图的最小生成树,
-
动态规划
-
dynamic programming 多阶段决策过程的最优化理论。我们想要解决一个递归关系,而递归涉及到重叠的实例。通过组合子实例的最优解,可以得到实例的最优解。
-
Fibonacci, bottom-up;
-
Coin-row problem: S(n)= {s(n-1),s(n-2)+Vn};
有一排硬币,只能选择不相邻的硬币,求最大价值。
-
the Knapsack problem:
f [ i ] [ v ] = m a x ( f [ i − 1 ] [ v ] , f [ i − 1 ] [ v − w [ i ] ] + v a l [ i ] ) f[i][v]=max( f[i-1][v],f[i-1][v-w[i]]+val[i] ) f[i][v]=max(f[i−1][v],f[i−1][v−w[i]]+val[i])-
自顶向下求解最大值,问题:重复计算
-
方法1:自下向上求出所有的最大值,存在浪费,
-
方法2:自上向下求出的值进行记录,避免重复计算。
-
Warshall’s Algorithm: Computing the transitive closure of a directed graph
- 计算一个图中,经过k步哪些点是连通的。
- 三次循环,第一层,从1到k,第二三层,矩阵求积。
-
Floyd–Finding shortest distances in weighted directed graphs
-
-
递归迭代
- 递归和栈(先进后出)在一定程度上可以转换
3.树
4.图
5.排序算法
需要重点掌握熟练写出来的算法是:1 5 6 7.
- 1.冒泡排序bubble sort,依次交换向后放
- 2.选择排序selection sort,每次比较选择最小的下标放在开头,减少了交换的次数
- 3.插入排序insection sort,减治算法,减变治排序
- 4.希尔排序Shell sort,减治法,减少每次减少的数值,直到1.
- 5.快速排序quick sort,快速排序的基本思想是:采取分而治之的思想,把大的拆分为小的,每一趟排序,把比选定值小的数字放在它的左边,比它大的值放在右边;重复以上步骤,直到每个区间只有一个数。此时数组已经排序完成。
- 6.归并排序merge sort,归并排序的基本思想:分治,一分二,然后比较大小合并到一起
- 7.堆排序 heap sort,找堆最大值N×logN
- 特定问题排序:8. Sorting by counting: 数字很多,但种类很小,hashing思想,数字的种类作为index,计算每个index的数量,进行排序。 复杂度:N
6.字符串算法
-
Horspool’s String Search Algorithm:
-
其他字符串匹配算法:
-
hashing: 通过时间换空间的最佳例子。