貪心法 Huffman樹

2021-10-10 09:24:16 字數 1427 閱讀 9091

問題:

給定字符集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 ...