《Algorithms》第5章:Greedy Algorithms 學習筆記

Chapter 5:Greedy Algorithms

1、Greedy algorithms build up a solution piece by piece, always choosing the next piece that offers the most obvious and immediate benefit.


2、每步只看眼前效果最好的做法就是貪婪,我們希望通過局部最優達到全局最優。貪婪算法只找到一種可行解,但不一定是最優解。


3、最小生成樹
  • 性質一:Removing a cycle edge can not disconnect a graph
  • 性質二:A tree on n nodes has n-1 edges.
    樹是連通且沒有環的無向圖。樹因爲其結構的簡單性而具有很多應用。例如,n個結點的樹有且僅有n-1條邊。n個結點和n-1條邊構成的圖不一定是樹,但如果此圖是連通的,則一定是樹
  • 性質三:Any connected, undirected graph G = (V, E) with |E| = |V| - 1 is a tree.
  • 性質四:An undirected graph is a tree if and only if there is a unique path between any pair of nodes.

4、割性質(Kruskal和prim算法的基礎):假定邊集X是圖G = (V, E)的某個最小生成樹的一部分。在圖G中挑選任意一組結點S,使得X裏沒有邊橫跨S和V-S兩個結點集合。假如e是所有橫跨這兩個集合權重最小的,則X∪{e}是某個最小生成樹的一部分。


5、最小生成樹的算法
  • Kruskal算法
    • 從邊的角度出發,每次選擇權值最小的邊(貪婪)
    • 如何判斷是否循環?用disjoint set

  • Prim算法
    • 從頂點角度出發,步驟爲
      • 初始時,生成樹的結點集U爲空
      • 隨意選擇一個結點,加入結點集,然後重複下列工作直至U=V
      • 選擇兩個端點分別位於U和V-U中的代價最小的邊(u, v)(貪婪)
      • 把(u, v)加入生成樹的邊集,v加入到U
    • Prim最小生成樹算法和Dijkstra最短路徑算法十分相似。Prim選擇最小的邊,Dijkstra選擇最小的距離。

6、貪婪算法的典型應用
  • 哈夫曼編碼
    • 先選擇兩個頻率最低的字母(貪婪),將其合併爲一棵子樹,並將該子樹的頻率記爲組成它的兩個字母的頻率之和
    • 如果將開始時的每個字母看成一棵子樹,則在上步後子樹個數少一
    • 重複上述上述步驟,直到只有一棵子樹爲止
  • Horn formulas
  • Set Cover
    • 定義:給定一個集合B和一組B中的子集合S1,S2...Sm,如何找出改子集中的一組數量最小的子集,使得B中的所有元素均包括在選取的這組子集中?
    • 貪婪策略:每次選取包含最多尚未被覆蓋的子集,直到B中雖有元素被覆蓋爲止
    • 不是最優策略,但可以證明:此策略選取的子集個數最多不會超過最優結果的ln(n)倍,其中|B| = n
  • 事件序列問題
    • 定義:給定一系列事件,已知開始時間和結束時間,對於給定一段時間,怎麼安排事件,使得不重疊事件發生的數目最多?
    • 貪婪策略:按結束時間排序,每次都選擇最早結束且不衝突的事件













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章