数据结构笔记(8)算法设计思想

贪婪算法

  • 调度问题(略)
  • 哈夫曼编码问题(Huffman)

    1. 前缀码,歧义(待补)
    2. 算法:
      • 假设字符的个数为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)
快速选择问题
  1. 概述:找出含N个元素的表S中的第k个最小的元素。
  2. 算法思想:
    • 选取一个合适的元素作为枢纽元v
    • 剩下的元素中,比v小的放在集合S1中,比v大的放在集合S2中,则整个表为S1-v-S2
    • 如果k< S1,则递归的计算S1中第k小的元素得到目标解;
      如果k=S1+1,则枢纽元v为目标解;
      如果k> S1,则递归的计算S2中第(k-S1-1)个元素得到目标解。
  3. 如何选择合适的枢纽元?(待补)

动态规划算法(Dynamic Programming)

  • 动态规划的过程是一种回溯的思想。
硬币选择问题:

你可能感兴趣的:(数据结构笔记,数据结构)