怎麼實現huffman(哈夫曼編碼)以及解碼

2021-06-01 18:45:19 字數 2612 閱讀 3500

一、編碼

【題目描述】

給定一篇用於通訊的英文電文,統計該電文中每個字元出現的頻率,按頻率左小右大的方法為這些字元建立哈夫曼(huffamn)樹,並編出每個字元的哈夫曼樹碼,輸出該電文的哈夫曼碼譯文。

【輸入】

輸入檔案huffman.in是一篇用於通訊的英文電文。

【輸出】

輸出檔案huffman.out輸出該電文的哈夫曼碼譯文。

【輸入輸出樣例1】

huffman.in

huffman.out

aaccdddbacbcddddddd

【資料限制】

2<=英文電文字元數<=10000000

統計以上abcd出現的個數。

a:3   b:2    c:4    d:10

構造出哈夫曼樹

a:011         b:010     c  :00          d:1

下面主要通過兩個結構體陣列來實現:

struct node1

ht[2*n0-1+1];

陣列下標12

3456

7父節點的陣列下標parent00

00左孩子節點的陣列下標lch00

00右孩子節點的陣列下標rch00

00權值w324

10 陣列下標12

3456

7父節點的陣列下標parent55

000左孩子節點的陣列下標lch00

002右孩子節點的陣列下標rch00

001權值w32

4105

陣列下標12

3456

7父節點的陣列下標parent55

6767

0左孩子節點的陣列下標lch00

0025

6右孩子節點的陣列下標rch00

0013

4權值w32

41059

19 struct node2

hc[n0+1];

大概圖如下面

美工不好啊 大概將就看了啊

下面給出大家想要的程式部分

//#include "stdio.h"

//#include "string.h "

#include #include const int n0=10;

const int n=100;

const int inf=1000000;

struct node1

ht[2*n0-1+1];

struct node2

hc[n0+1];

int n,root;//n為葉子的個數

void readdata()

; n=0;

freopen( "huffman.in", "r", stdin);//讀文字檔案

while( (ch=getchar()) != eof )

num[ch]++;

for( int i=0; i<=255; i++ ) }

}void select1( int t, int *s1, int *s2)//用兩個數來記錄沒有在樹上的最小的兩個值,從而進一步生成樹。

}int main()

二、解碼

【題目描述】

給定2個輸入檔案,第1個輸入檔案是用於通訊的英文電文,統計該電文中每個字元出現的頻率,按頻率左小右大的方法為這些字元建立哈夫曼(huffamn)樹,並編出每個字元的哈夫曼樹碼;第2個輸入檔案是已經按第1個輸入檔案的英文電文編好的哈夫曼碼,輸出該哈夫曼碼的對應的英文電文。

【輸入】

第1個輸入檔案為huffman.in是用於通訊的英文電文, 第2個輸入檔案codetotxt.in是已經按第1個輸入檔案編好的哈夫曼碼。

【輸出】

輸出檔案codetotxt.out輸出codetotxt.in檔案內容的英文電文。

【輸入輸出樣例1】

huffman.in

codetotxt.in

codetotxt.out

aaccdddbacbcddddddd

adddaccdddbacbcdddd

【資料限制】

2<=英文電文字元數<=10000000

#include #include const int n0=10;

const int n=100;

const int inf=1000000;

struct node1

ht[2*n0-1+1];

struct node2

hc[n0+1];

int n,root,num[256];

void readdata() }}

void select1( int t, int *s1, int *s2)

{ int w1,w2;

w1=w2=inf;

for( int i=1; i<=t; i++ )

if( ht[i].parent==0 )

if( ht[i].w

哈夫曼編碼 Huffman

huffman編碼流程 資料壓縮流程 1 讀取輸入 2 將輸入中的每個char值得出現頻率製成 3 根據頻率構造huffman編碼樹 4 構造編譯表,將輸入中的每個char值和乙個位元字串相關聯 5 將單詞查詢樹編碼為位元字串並寫入輸出流 6 將單詞總數編碼為位元字串並寫入輸出流 7 使用編譯表翻譯...

哈夫曼樹(huffman)

學完了huffman樹,講一下自己對它的理解 圖二public class huffmantree override public int compareto nonnull treenodeo else if this.weight o.weight return 0 傳乙個陣列進來 建立哈夫曼樹...

哈夫曼(Huffman)樹構造和哈夫曼編碼

n個權值,則構造出的哈夫曼樹有 n個葉子結點。n個權值分別設為 w1,w2,wn,則哈夫曼樹的構造規則為 1 根據給定的 n個權值構成n 棵二叉樹的集合 f 2 每次選擇兩個權值最小的二叉樹做子樹合併為乙個新的二叉樹,新二叉樹的權值為兩個子樹的和。直到森林中只剩一棵樹為止,該樹即為我們所求得的哈夫曼...