赫夫曼編碼是根據字元的使用頻率對字元進行編碼的一種編碼方法,其用於壓縮資料的效果非常好。一般用二叉樹表示赫夫曼編碼,使用頻率越低的字元,其深度越大。其中q表示乙個按頻率從小到大排序的優先佇列。
在赫夫曼編碼的表示中,通常用字首碼的表達方法。字首碼即沒有任何碼字是其他碼字的字首,其作用是簡化解碼過程。用二叉樹表示字首碼時,0表示轉向左孩子,1表示轉向右孩子。檔案的最優編碼方案總是對應一棵滿二叉樹。
下面是原始碼:
huffman.h
#include#includestruct node;//二叉樹的乙個節點的結構體
struct queue;//佇列的結構體
struct node * extractmin(struct queue *q);//返回佇列q中最小的元素並刪除它
void insert(struct queue *q,struct node *z);//將節點z插入到佇列q中
void huffman(struct queue *q,int n);//對佇列q進行赫夫曼編碼,n為字元的個數
void print(struct node *q);//列印赫夫曼編碼的二叉樹
huffman.cpp
#include"huffman.h"
struct node * extractmin(struct queue *q)
else
return p;
}void insert(struct queue *q,struct node *z)
else
else
if(m==null)
else
} }}void print(struct node *q)
else
}void huffman(struct queue *q,int n)
struct node *res;
res=(struct node *)malloc(sizeof(struct node));
res=q->con;
print(res);
}
main.cpp
#include"huffman.h"
int main()
no[0]->left=null;
no[0]->right=null;
no[0]->freq=5;
no[0]->e='f';
no[1]->left=null;
no[1]->right=null;
no[1]->freq=9;
no[1]->e='e';
no[2]->left=null;
no[2]->right=null;
no[2]->freq=12;
no[2]->e='c';
no[3]->left=null;
no[3]->right=null;
no[3]->freq=13;
no[3]->e='b';
no[4]->left=null;
no[4]->right=null;
no[4]->freq=16;
no[4]->e='d';
no[5]->left=null;
no[5]->right=null;
no[5]->freq=45;
no[5]->e='a';
head=(struct queue *)malloc(sizeof(struct queue));
p=(struct queue *)malloc(sizeof(struct queue));
head->con=no[0];
head->next=null;
p=head;
for(i=1;i<6;i++)
huffman(head,6);
system("pause");
return 0;
}
收穫有三個:
第乙個是各種結構體,結構體陣列,結構體指標調來調去,很容易混亂。而且結構體指標一定要初始化,使用之前一定要分配記憶體空間;
第二個是and語句的執行順序,有時候會導致程式出錯。比如
while(m!=null&&m->con->freq<=z->freq)
原來我是兩個反過來的,結果提示一直出錯,後來才知道是因為and語句中,先執行第乙個,若第乙個為假,則後乙個是不用執行的,只有第乙個為真才判斷第二個是否為真。這個之前就學過,一直沒遇到。今天遇到了也是一種幸運。
第三個是關於除錯的。以前除錯的時候,遇到結構體或者結構體指標總覺得很麻煩,因為看不到結構體的內容。這次除錯,發現可以設定變數,通過監控變數的值檢視結構體的內容。真是棒!
演算法導論 貪心演算法之赫夫曼編碼
討論赫夫曼編碼問題,赫夫曼編碼的思想就是變長編碼。變長編碼就是讓字元表中出現概率高的字元的編碼長度盡可能小,而出現概率高的字元的編碼長度相對較長。然後還要遵循字首碼的要求,就是任意乙個編碼都不是其他編碼的字首碼,這樣方便解碼。對於下表中的字元和相應的出現概率,有對應圖中的編碼樹 可以比較容易的看出來...
貪心演算法 赫夫曼編碼問題(Huffman)
赫夫曼編碼是一種廣泛用於資料壓縮的問題,該演算法的主要優勢在於節約了儲存和傳輸成本。舉乙個例子 假設要傳輸的資料為 那麼傳輸成本就是 45 3 30 3 29 3 10 3 8 3 5 3 381個字元 先合併最小頻率的2個字元對應的子樹,計算合併後的子樹的頻率 重新排序各個子樹 重複步驟1 重複步...
小白高階之貪心演算法VS動態規劃
貪心演算法和動態規劃 相同點 要求乙個問題具有最優子結構的性質。不同點 動態規劃每一步都要進行一次選擇,但是選擇依賴於子問題的解 貪心演算法進行選擇時,直接作出在當前問題中看來最優的選擇,而不考慮子問題的解。例如0 1揹包問題就可以用動態規劃解決而不能用貪心演算法,但是分數揹包問題就是用貪心演算法解...