問題:
給定字符集c=以及每個字元頻率f(ci),求關於c的乙個最優字首編碼(總碼長最小)。
分析:
每次選擇最小頻率的兩個子樹合併為新的子樹,進行n-1次操作即可。
證明略。
**:
#include
using
namespace std;
struct node};
struct cmp};
// 建立huffman樹,貪心的選擇
// 輸入:待編碼字符集c,出現概率f,字元數量n
// 輸出:建立好的huffman樹的根節點指標
node*
huffman
(char c,
float f,
int n)
// 進行n-1次操作
while
(--n)
return pq.
top();
}// 查詢某個字元的編碼
// 輸入:huffman樹根節點root,待查詢字元c,結果記錄棧res(在遞迴中記錄中間結果很頭痛,即使用全域性變數或者函式加乙個引數也稍顯麻煩)
void
showcode
(node* root,
char c,stack<
int> res)
while
(!res1.
empty()
)return;}
if(root-
>leftchild==
null
&& root-
>rightchild==
null
)return
; res.
push(0
);showcode
(root-
>leftchild,c,res)
; res.
pop();
res.
push(1
);showcode
(root-
>rightchild,c,res)
; res.
pop();
}int
main()
;float f[5]
=;stack<
int> res;
showcode
(huffman
(c, f, n)
,'f'
, res)
;}
複雜度:
n-1次操作,每次向堆中新插入元素,需要o(logn)複雜度,因此共o(nlogn)
p.s. csdn的markdown語法中c++竟然是cpp,***,寫了快一年才發現,離譜
演算法 貪心法
動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...
演算法 貪心法
感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...
貪心法簡介
1.貪心法的設計思想 例 n項活動,每項活動有開始時間和結束時間,不能同時舉行,設計安排使得被安排的活動數量最多 策略 將活動結束時間從小到大排列,從前向後選擇,只要與前面的活動相容,就將活動選入a include using namespace std int s 100 e 100 d 100 ...