14. Huffman Algorithm
HUFFMAN(C)
1. n |C|
2. Q C
3. for i 1 to n-1
4. do allocate a new node z
5. left[z] x EXTRACT-MIN(Q)
6. right[z] y EXTRACT-MIN(Q)
7. f[z] f[x] + f[y]
8. INSERT(Q , z)
9. return EXTRACT-MIN(Q)
14
15. Huffman Algorithm
10 15 12 13 3 4 1
a e i o s t z
4
T1
10 15 12 13 4 3 1
a e i o t s z
T2 8
4 4
T1 t
10 15 12 13 3 1
a e i o s z 15
16. Huffman Algorithm
15 12 13
e i o 18 15 18
T3
10 e T3
8 10
T2 a 8
T2 a
4 4 4 25
4
T1 t T1 t
T4
3 1 12 13
3 1
s z s z i o
16
17. Huffman Algorithm
25 58
33
T4 T3 0 T5 1
25
12 13 18 15 33 T4
e T3 1
i o T2 0 1 0
10 18 15 12 13
8 e
T2 a 0 T2 1 i o
8 10
4 4
T1 t 0 T2
1
a
4 4
3 1 T1 t
s z 0 1
3 1
s z 17
18. Prefix Code
符號 s z t a e i o
編碼 00000 00001 0001 001 01 10 11
• 透過霍夫曼演算法建構的二元樹,符合Prefix
code特性。
– 任一編碼不為其它編碼之字首
• 不符合Prefix code特性會照成解碼混淆。
假設a = 01, e = 00, i = 1, s = 0001, t = 00011,欲解壓縮二元編碼為00011。
可能結果:
Case 1:00 01 1 eai
Case 2:0001 1 si
Case 3:00011 t 18
19. • 壓縮檔最佳碼
– 一個檔案的一個最佳碼永遠使用一棵接近完整二元
樹(almost complete binary tree)來表示,即每個內
部節點都剛好有兩個子節點
– 若一棵接近完整二元樹有N個葉子,則表示它有N-1
個內部節點。
– 對於字元表C中的每個字元c而言,假設f(c)代表在
檔案內c的頻率,d(c)代表在二元樹內葉子c的深度,
則對該檔案編碼後所需的位元數目為:
B(T ) f (c)d (c)
c C
19
20. 58
0 T5 1
25
33 T4
0
T3 0 1
1
18 15 12 13
0 T2 1
e i o
10
8
0 T2 1 a
4 4
T1 t
0 1
3 1
s z B(T)=3*5+1*5+4*4+10*3+15*2+12
*2+13*2=146 bits
20
21. Time Complexity
HUFFMAN(C)
1. n |C|
2. Q C Ο( n )
3. for i 1 to n-1
4. do allocate a new node z
5. left[z] x EXTRACT-MIN(Q) Ο( log n ) ×
6. right[z] y EXTRACT-MIN(Q) (n-1)
7. f[z] f[x] + f[y] O( n log n )
8. INSERT(Q , z)
9. return EXTRACT-MIN(Q)
21
24. Gale-Shapley Algorithm
1. function stableMatching {
2. Initialize all m ∈ M and w ∈ W to free
3. while ∃ free man m who still has a woman w to propose to {
4. w = m's highest ranked such woman to whom he has not yet proposed
5. if w is free
6. (m, w) become engaged
7. else some pair (m', w) already exists
8. if w prefers m to m'
9. (m, w) become engaged
10. m' becomes free
11. else
12. (m', w) remain engaged
13. }
14. }