贪婪算法
- 调度问题(略)
哈夫曼编码问题(Huffman)
- 前缀码,歧义(待补)
- 算法:
- 假设字符的个数为C
- 一颗树的权等于其树叶的频率的和,任意选取最小权的两棵树T1和T2,并任意形成以T1和T2为子树的新树,将这样的过程进行C-1次
- 在算法的开始,我们拥有C颗树,每个字符以它自身作为一颗树,在算法的结束我们得到一棵树
分治算法(Divide & Conquer)
- 分(divide):递归解决较小的问题
- 治(conquer):从子问题的解构建原问题的解
- 分治算法的主定理
- n 表示问题规模
- a 表示一次递归将问题划分为多少个子问题
- b 表示子问题的规模
- f(n)表示非递归步骤的开销
得到公式:T(n)=aT(n/b)+f(n) (a>=1;b>1)
case | T(n) | c | f(n) |
---|---|---|---|
Case 1 | T(n)=O(nlogb^a) | c< log b^a (a>b^c) | f(n)=O(n^c) |
Case 2 | T(n)=O(n^c log^k+1 n) | c= log b^a (a=b^c) | f(n)=O(n^c log^kn) |
Case 3 | T(n)=O(f(n)) | c> log b^a (a< b^c) | f(n)=Ω(n^c) |
快速选择问题
- 概述:找出含N个元素的表S中的第k个最小的元素。
- 算法思想:
- 选取一个合适的元素作为枢纽元v
- 剩下的元素中,比v小的放在集合S1中,比v大的放在集合S2中,则整个表为S1-v-S2
- 如果k< S1,则递归的计算S1中第k小的元素得到目标解;
如果k=S1+1,则枢纽元v为目标解;
如果k> S1,则递归的计算S2中第(k-S1-1)个元素得到目标解。
- 如何选择合适的枢纽元?(待补)
动态规划算法(Dynamic Programming)
- 动态规划的过程是一种回溯的思想。