演算法設計與分析入門 貪心演算法之哈夫曼編碼問題

2021-10-04 11:30:13 字數 1440 閱讀 5245

1 二進位制編碼:用二進位制字元0-1串來表示

2 固定長編碼:每個0-1串的長度是固定的

3 可變長編碼:常用短,不常用長

4 字首編碼:沒有任何字元的編碼是其他字元的字首

這裡需要使用型結構.

使用字元出現的頻率和字元來作為結點的內容[字元:頻率]

這裡給出乙個例子:

[a:45],[b:13],[c,12],[d:16],[e:9],[f:5]

我們引入樹t的代價

設d t(

c)

d_t(c)

dt​(c)

是符號c在樹t的深度,即c的編碼長度

f (c

)f(c)

f(c)

是符號c出現的頻率,在結點中儲存

則t的代價是編碼乙個檔案的所有字元的**位數

b (t

)=∑c

f(c)

∗dt(

c)

b(t)=\sum_cf(c)*d_t(c)

b(t)=∑

c​f(

c)∗d

t​(c

) [貪心思想]

我們迴圈地選擇兩個具有最低頻率的兩個結點將它們生成一棵子樹,將這兩個結點的頻率和作為新的父節點的頻率值.這樣不斷進行,直到得到一棵完整的樹.

我們需要證明兩點

待補充

[貪心演算法偽**]

//c是字母表,x.y是c中具有最小頻率的兩個字元.

huffman

(c,f)

//字元的個數|c|

n<

-|c|

;//將c建立成堆

q<

-c; for i<

-1 to n-

1 do

//建立結點儲存z

z<

-allocate-

node()

;//堆操作

//堆的左邊指向x

x<

-left[z]

<

-extract-

min(q)

;//堆的右邊指向y

y<

-right[z]

<

-extract-

min(q)

;//父節點的頻率等於兩個子節點的頻率和

f(z)

<-f

(x)+

f(y)

//堆操作

insert

(q,z)

;return

[演算法分析]

演算法由兩部分組成 構建堆 + 堆操作

演算法設計與分析 貪心演算法

time limit 1000 ms memory limit 65536 kib problem description 一輛汽車加滿油後可行駛n公里。旅途中有若干個加油站。設計乙個有效演算法,指出應在哪些加油站停靠加油,使沿途加油次數最少。並證明演算法能產生乙個最優解。對於給定的n和k個加油站位...

演算法設計與分析 貪心演算法

分解 將原問題求解過程劃分為連續的若干個決策階段 決策 在每乙個階段依據貪心策略進行貪心決策,得到區域性的最優解,並縮小待求解問題的規模 合併 將各個階段的區域性解合併為原問題的乙個全域性最優解 greedy c c是問題的輸入集合即候選集合 初始解集合為空集 while not solution ...

演算法設計與分析 貪心演算法

所謂貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,但對範圍相當廣泛的許多問題他能產生整體最優解或者是整體最優解的近似解。貪心演算法的基本思路如下 1.建立數學模型...