利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼/解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編/解碼系統。
乙個完整的系統具有以下幾種操作:
0:初始化(initialization)。從終端讀入字符集大小n,以及n個字元和n個權值,建立哈夫曼樹。
1:編碼(encoding)。輸入乙個字串,利用已建好的哈夫曼樹對字串進行編碼,並輸出編碼後的結果。
2:解碼(decoding)。輸入乙個二進位制數字串,利用已建好的哈夫曼樹將數字串進行解碼,並輸出結果。
為了保證通訊順利進行,編碼要求按統一規範進行,構造哈夫曼樹的原則是選兩個權值最小的,構造乙個父結點,其中最小的結點為左孩子,次小的為右孩子,如果選中的兩個結點權值相等,則取排在前乙個位置的為左孩子。編碼原則是左孩子為0,右孩子為1。
現在給出一連串操作,要求根據操作指令和輸入資料輸出相應結果。
首先是乙個整數q,表示操作的次數。
接下來q行,每行表示一次操作,由乙個整數x表示操作型別。
t=0時,輸入乙個整數n以及n個字元和n個權值,由空格隔開;
t=1時,輸入乙個待編碼字串;
t=2時,輸入乙個二進位制數字串,表示已編碼的字串。
當t=1時,輸出一行編碼結果;
當t=2是,輸出一行解碼結果。
3 0 3 a b c 1 2 4
1 abcabc
2 0001100011
0001100011
abcabc
oj提交的程式不要輸出選單或者其他無關內容。
由於通常哈夫曼樹構造可能不唯一,注意題目要求中哈夫曼樹的編碼規範。
字元僅限大小寫字母和數字,大小寫敏感。
主要分為四個步驟
根據給定字元的權值建立起huffman樹根據已建立的huffman樹,從每個葉子往根節點走,
記錄下自己是父節點的左孩子(0)還是右孩子(1),
以此為依據建立當前字元對應的編碼,
並且按照原始葉子節點的順序存入編碼陣列中
輸入一串待編碼的字元。依次進行匹配為葉子節點中的第幾個,
正確匹配後,輸出葉子節點對應的huffman編碼。
對輸入的一串編碼進行解碼,從huffman樹的根節點出發,遇到0則前往左子樹,遇到1則前往右子樹。
直到遇到葉子節點為止,輸出該葉子節點的字元。
#include
#include
#include
#include
using
namespace
std;
#define max_weight 32767
struct node ;
struct hcode ;
void create_ht(node ht, int n)//根據原節點的權值構造huffman樹
for (int i = n; i < 2 * n - 1; i++)
else
if (ht[k].weight < min2) }}
//cout << "當前選中" << ht[left_node].data << "&" << ht[right_node].data << endl;
ht[left_node].parent = i;
ht[right_node].parent = i;
ht[i].weight = ht[left_node].weight + ht[right_node].weight;
ht[i].left_child = left_node;
ht[i].right_child = right_node;
//cout << "生成新節點權重:" << ht[i].weight << endl;
}}void create_hcode(node ht, hcode hcode, int n)//將每個字元轉換為相應的huffman編碼存入編碼陣列中
else
c = f;
f = ht[f].parent;
}hc.start++;//start指向huffman編碼最開始的字元
hcode[i] = hc;//將當前字元的huffman編碼存入編碼陣列中
}}void encoding(node ht, hcode hcode, char* arr, int n)//對傳入字串進行編碼}}
}cout
<< endl;
}void decoding(node ht, char* arr, int n)//對傳入編碼進行解碼
else
if (arr[i] == '1')
i++;
}cout
<< ht[temp].data;
}cout
<< endl;
}void print_hcode(hcode hcode, int n)//測試用,用於檢測是否正常將原節點進行編碼
cout
<< endl;
}}int main()
for (int i = 0; icin >> ht[i].weight;
}create_ht(ht, n);
create_hcode(ht, hcode, n);
//print_hcode(hcode, n);
}else
if (t == 1)
else
if (t == 2)
}system("pause");
return
0;}
哈夫曼編碼 Huffman
huffman編碼流程 資料壓縮流程 1 讀取輸入 2 將輸入中的每個char值得出現頻率製成 3 根據頻率構造huffman編碼樹 4 構造編譯表,將輸入中的每個char值和乙個位元字串相關聯 5 將單詞查詢樹編碼為位元字串並寫入輸出流 6 將單詞總數編碼為位元字串並寫入輸出流 7 使用編譯表翻譯...
哈夫曼編碼與解碼
include include include include define maxnum 60typedef struct huffnode typedef struct huffcode huffnode ht maxnum 2 存放哈夫曼樹 huffcode hcd maxnum 存放ht陣列...
怎麼實現huffman(哈夫曼編碼)以及解碼
一 編碼 題目描述 給定一篇用於通訊的英文電文,統計該電文中每個字元出現的頻率,按頻率左小右大的方法為這些字元建立哈夫曼 huffamn 樹,並編出每個字元的哈夫曼樹碼,輸出該電文的哈夫曼碼譯文。輸入 輸入檔案huffman.in是一篇用於通訊的英文電文。輸出 輸出檔案huffman.out輸出該電...