数据结构重要知识点记录
时间复杂度分析
MaxSubsequenceSum
1 | int |
表、栈和队列
- 线性表的数组与链表实现
- 基数排序与桶式排序
Radix Sort
1 | def radix_sort(List): |
Stack
Reverse Polish
- 队列
##树 - 树的表示
- 父子兄弟树
二叉树,树的遍历,决策树
1
2
3
4
5
6typedef struct binTreeNode
{
ElementType element;
struct binTreeNode *left;
struct binTreeNode *right;
}- Pre-order/Post-order/In-order
- 通过遍历结果构造树
- 数组表示二叉树 A[current] A[21] A[2\i+1]
- 表达式树
二叉查找树
- Data Struct with fast search, slow insert/delete
- Sorted array, with bounded size
- Data Structure with fast insert/delete, slow search
- Linked List
- Balance BST : fast search fast insert fast delete
- No bounded size
- All operations log(n) ,if balanced
- find(迭代形式)
- findMin/findMax
- insert
- delete
- BST的平均复杂度
- Data Struct with fast search, slow insert/delete
- 平衡二叉树:AVL树(红黑树没讲)
- 旋转
- $h \approx \sqrt{2}\log N_h$
- B-树 B+树(没讲)
Hash
- 冲突的解决
- 分离链路法
- 装填因子$\lambda$为元素个数与散列表大小的比值 最好 $\lambda \approx 1$
- 开放地址法
- $\lambda < 0.5$
- 线性探测法 $F(i) = i$
- 平方探测法 $F(i) = i^2$
- 分离链路法
- 再散列 运行时间$O(N)$
- 随机数算法
1 | unsigned char Rand8[256]; //This array contains a random permutation |
通常在Element[0]
处,放一个绝对的最小值
时间复杂度$O(1)$, actually 2.607 comparisons and 1.607 moves
- percolate down()
1 | int DeleteMin( PriorityQueue H) |
最坏情形$O(\log N)$
平均运行时间为$O(\log N)$
- 建堆 (Build a Heap)
从第一个非叶节点,不断下滤
$O(N)$ - 堆排序
- Complexity = build a heap + deleteMax n times, $O(n\log n)$
Sort
InsertionSort
ShellSort
heapsort
mergesort
quicksort
Median-of-Three Partitioning(三数m中值分割法)
ExternalMergeSort
图论
图的表示
Adjacency List (临接链表)
Adjacency Matrix (邻接矩阵)
图的节点访问
最小生成树
Prim
Kruskal
最短路
unweighted path length
breadth-first-search(广度优先搜索)
1 | void Unweighted( Table T) |
depth-first-search(深度优先 )
1 | void dfs(vert v) |
weighted path length
Dijkstra
1 | void Dijkstra( Table T ) |