利用哈夫曼編碼進行通訊,可以壓縮通訊的資料量,提高傳輸效率,縮短資訊的傳輸時間,還有一定的保密性。現在要求編寫一程式模擬傳輸過程,實現在傳送前將要傳送的字元資訊進行編碼,然後進行傳送,接收後將傳來的資料進行解碼,即將資訊還原成傳送前的字元資訊。
在本例中設定傳送者和接受者兩個功能,
傳送者的功能包括:
①輸入待傳送的字元資訊;
②統計字元資訊**現的字元種類數和各字元出現的次數(頻率);
根據字元的種類數和各自出現的次數建立哈夫曼樹;
③利用以上哈夫曼樹求出各字元的哈夫曼編碼;
④將字元資訊轉換成對應的編碼資訊進行傳送。
接受者的功能包括:
①接收傳送者傳送來的編碼資訊;
②利用上述哈夫曼樹對編碼資訊進行翻譯,即將編碼資訊還原成傳送前的字元資訊。
從以上分析可發現,在本例中的主要演算法有三個:
(1)哈夫曼樹的建立;
(2)哈夫曼編碼的生成;
(3)對編碼資訊的翻譯。
先用map來處理處理輸入的字串,統計每個字元出現次數,並將得到的次數賦給ht陣列的權值,並且用乙個陣列記錄相應權值的字母用以解碼;再利用哈夫曼樹編碼,其原理是:根據得到的這些權值,構造只有根節點的二叉樹,這些二叉樹構成乙個森林f,在森林f中選取兩棵根結點的權值最小的樹作為左右子樹構造一顆新的二叉樹,且重置新的二叉樹的根結點的權值為其左右子樹上根節點的權值之和,在森林f中刪除這兩顆二叉樹同時將新的到的加入到f中,重複上述步驟直到f中只剩下一棵樹為止。在構造哈夫曼樹時,首先選擇權值小的,這樣保證權值大的離根較進,這樣一來在計算的樹帶權路徑長度時,會得到最小的帶權路徑長度,這種演算法是一種貪心的演算法。
再將得到的每個字元的編碼放在同乙個陣列中,然後傳給哈弗解碼函式,解碼時從根結點開始向下走直到走到葉子結點,然後輸出葉子結點的字母,重複這樣,直到得到原字串,然後輸出,解碼完成。詳細見**。
#include#include#includeusing namespace std;
#include#include#includeconst int inf=100000000;
typedef char **huffmancode;
char *yma;
char zf[100];
char yc[1000];
typedef structhtnode,*huffmantree;
int init(huffmantree &ht)
return k;
}int select(huffmantree &ht,int i,int n) //選擇函式}}
ht[s].parent=i; //將其雙親賦值為i
return s;
}int creattree(huffmantree &ht)
for(int j=k+1;j<=(2*k-1);j++)
printf("哈夫曼樹建立成功!\n\n");
system("pause");
system("cls");
return k;
}void creathffcode(huffmantree ht,huffmancode &hc,int n)
hc[i]=new char[n-start];
strcpy(hc[i],&cd[start]);
}delete cd;
printf("生成哈夫曼編碼成功!以下是哈夫曼編碼表:\n\n");
printf("節點\t字元\t權值\t編碼\n");
for(int i=1;i<=n;i++)
printf("\n");
int l=strlen(yc);
for(int i=0;iprintf("該字串所生成的編碼為:\n");
int ll=strlen(yma);
for(int i=3;iprintf("%c",yma[i]);
printf("\n\n");
yma[ll]='\0';
system("pause");
system("cls");
}void trancode(huffmantree ht,int n)
}b[k]='\0';
printf("解碼成功!該二進位製碼代表的字串為:\n");
printf("%s\n\n",b);
system("pause");
system("cls");
}int main()
if(z!=1&&z!=2&&z!=3&&z!=4)
switch(z)
}return 0;}/*
aadddccccggrs
*/
哈夫曼編碼 解碼系統(樹應用)
問題描述 利用哈夫曼編碼進行通訊,可以壓縮通訊的資料量,提高傳輸效率,縮短資訊的傳輸時間,還有一定的保密性。現在要求編寫一程式模擬傳輸過程,實現在傳送前將要傳送的字元資訊進行編碼,然後進行傳送,接收後將傳來的資料進行解碼,即將資訊還原成傳送前的字元資訊。實現提示 在本例中設定傳送者和接受者兩個功能,...
哈夫曼編碼解碼
簡單實現編碼解碼功能 列印哈夫曼樹形 該怎麼做呢 求教!實現初始化,建立huffman樹,並完成字元的編碼 之前解碼用for迴圈不能夠重新復位遍歷 while更好用 include stdio.h include string.h define n 10 待編碼字元的個數,即樹中葉結點的最大個數 d...
哈夫曼樹的應用 哈夫曼編碼
include include include 樹結點定義 typedef struct htnode,huffmantree static char n 100 用於儲存正文 哈弗曼編碼,char型二級指標 typedef char huffmancode 封裝最小權結點和次小權結點 typede...