貪心演算法之哈夫曼編碼

2021-07-29 06:50:10 字數 2625 閱讀 3599

哈夫曼編碼簡介

舉例以及詳細說明

**塊測試結果

二叉樹中有一種特別的樹——哈夫曼樹(最優二叉樹),其通過某種規則(權值)來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點(很重要),其他的非葉子節點是為了構造出哈夫曼而引入的!

哈夫曼編碼是乙個通過哈夫曼樹進行的一種編碼,一般情況下,以字元:『0』與『1』表示。編碼的實現過程很簡單,只要實現哈夫曼樹,通過遍歷哈夫曼樹,規定向左子樹遍歷乙個節點編碼為「0」,向右遍歷乙個節點編碼為「1」,結束條件就是遍歷到葉子節點!因為上面說過:哈夫曼樹葉子節點才是有效資料節點!

一、對給定的n個權值構成n棵二叉樹的初始集合f= ,其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。(為方便在計算機上實現算 法,一般還要求以ti的權值wi的公升序排列。)

二、在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。

三、從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到集合f中。

四、重複二和三兩步,直到集合f中只有一棵二叉樹為止。

簡易的理解就是,假如我有a,b,c,d,e五個字元,出現的頻率(即權值)分別為5,4,3,2,1,那麼我們第一步先取兩個最小權值作為左右子樹構造乙個新樹,即取1,2構成新樹,其結點為1+2=3,如圖:

虛線為新生成的結點,第二步再把新生成的權值為3的結點放到剩下的集合中,所以集合變成,再根據第二步,取最小的兩個權值構成新樹,如圖:

再依次建立哈夫曼樹,如下圖:

其中各個權值替換對應的字元即為下圖:

所以各字元對應的編碼為:a->11,b->10,c->00,d->011,e->010

霍夫曼編碼是一種無字首編碼。解碼時不會混淆。其主要應用在資料壓縮,加密解密等場合。

#include

#include

#define maxbit 100

#define maxvalue 10000

#define maxleaf 30

#define maxnode maxleaf*2-1

typedef

struct

hcodetype;

typedef

struct

hnodetype;

hnodetype huffnode[maxnode];//定義全域性變數和陣列可以自動初始化

hcodetype huffcode[maxleaf], cd;//

void huffmantree(hnodetype huffnode[maxnode], int n)

//printf("輸入n個葉子結點的權值:\n");

for (i = 0; i < n; i++)

//迴圈構造哈夫曼樹,n個葉子結點需要n-1次構建

貪心演算法 (哈夫曼編碼)HuffmanCode

哈夫曼編碼應用在於對於檔案的壓縮,壓縮效率是非常的高。實現哈夫曼編碼,得首先知道哈夫曼樹的形成過程是怎樣進行的 1 對於所要編碼的資料,首先得將它們中找到其中的最小的兩個位置合併成乙個小樹,節點的權值是兩者相加形成的 2 步驟1中得到的權值在進入原排列中,在此獲取新組合中的最小的兩個資料,在執行步驟...

演算法 貪心演算法 哈夫曼編碼 python

博主自己手擼的 若有有錯誤,感謝指出 直接上 目錄0 講義 0.1 二元字首碼 0.2 平均傳輸位數 0.3 偽碼 0.4 例項 計算平均位數 哈夫曼編碼 生成哈夫曼樹 主函式 哈夫曼編碼是資料結構常考知識點,對比以前c寫的 python真的簡單易懂。哈夫曼編碼,計算平均位數 def huffman...

貪心 哈夫曼編碼 哈夫曼樹

解決問題 哈夫曼樹 眾所周知,計算機以01串來儲存和運算。所以,如果我們想要存乙個字元或漢字,例如a,計算機會將它變為乙個01串,這個串就是a的編碼。如果我們輸入了乙個詞 cat。如果a的編碼是1,c的編碼是10,t的編碼是11,那麼 cat 對應的編碼就是 10111 好了,那麼問題來了 1011...