小白高階之貪心演算法 赫夫曼編碼

2021-07-14 03:33:19 字數 2378 閱讀 7426

赫夫曼編碼是根據字元的使用頻率對字元進行編碼的一種編碼方法,其用於壓縮資料的效果非常好。一般用二叉樹表示赫夫曼編碼,使用頻率越低的字元,其深度越大。其中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揹包問題就可以用動態規劃解決而不能用貪心演算法,但是分數揹包問題就是用貪心演算法解...