哈夫曼(Huffman)編碼與解碼

2021-07-31 23:36:52 字數 2882 閱讀 2375

利用哈夫曼編碼進行資訊通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳輸資料預先編碼,在接收端將傳來的資料進行解碼。對於雙工通道,每端都需要乙個完整的編碼/解碼系統。試為這樣的資訊收發站寫乙個哈夫曼的編/解碼系統。

乙個完整的系統具有以下幾種操作:

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輸出該電...