給定權值,哈弗曼編碼 解碼

2021-09-29 17:03:07 字數 2260 閱讀 7353

假設某通訊報文的字符集由a,b,c,d,e,f這6個字元組成,它們在報文**現的頻度(頻度均為整數值)。

(1)構造一棵哈弗曼樹,依次給出各字元編碼結果。

(2)給字串進行編碼。

(3)給編碼串進行解碼。

構建哈弗曼樹時:左子樹根結點權值小於等於右子樹根結點權值。

生成編碼時:左分支標0,右分支標1。

第一行:依次輸入6個整數,依次代表a,b,c,d,e,f的頻度,用空格隔開。

第二行:待編碼的字串

第三行:待解碼的編碼串

前6行依次輸出各個字元及其對應編碼,格式為【字元:編碼】(冒號均為英文符號)

第7行:編碼串

第8行:解碼串

3 4 10 8 6 5

bee0010000100111101

a:000

b:001

c:10

d:01

e:111

f:110

001111111

badbed

//

// created by haoren on 2019/11/6.

//#include

#include

#include

#define n 100

#define m 2*n-1

//哈夫曼樹結構

typedef

struct nodehtnode, huffmantree[m+1]

;//編碼結構

typedef

char

* huffmancode[n+1]

;//找最小,次小函式

void

select

(huffmantree ht,

int n,

int*s1,

int*s2)

}for

(int i =

1; i <= n; i++)}

*s1 = temp;

for(

int i =

1; i <= n; i++)}

for(

int i =

1; i <= n; i++)}

*s2 = temp;

}//建立哈夫曼樹

void

crthuffmantree

(huffmantree ht,

int w,

int n)

for(

int i = n+

1; i <= m; i++

)for

(int i = n+

1; i <= m; i++)}

//哈夫曼編碼

void

crthuffmancode

(huffmantree ht, huffmancode hc,

int n)

hc[i]=(

char*)

malloc

((n-start)

*sizeof

(char))

;strcpy

(hc[i]

,&cd[start]);

}free

(cd);}

//哈夫曼解碼

void decode (huffmantree ht,

char ch)

}}intmain

(void

)char ch[10]

;//編碼時輸入字串

char ch1[

100]

;//解碼時輸入字串

scanf

("%s"

, ch)

;scanf

("%s"

, ch1)

;crthuffmantree

(hfmtree, w,6)

; huffmancode hfmcode;

crthuffmancode

(hfmtree, hfmcode,6)

;for

(int i =

1; i <=

6; i++

)for

(int i =

0; i <

strlen

(ch)

; i++

)printf

("\n");

decode

(hfmtree, ch1)

;return0;

}

給定權值求哈弗曼樹

include include using namespace std define maxsize 10 typedef int elemtype typedef struct btreenode btreenode 根據陣列 a 中 n 個權值建立一棵哈夫曼樹,返回樹根指標 btreenode ...

哈弗曼編碼 哈弗曼樹

哈弗曼編碼是依賴於字元使用頻率來建立的一種編碼,通過把使用頻率低的字元分配相對較多的01編碼,而使用頻率高的分配相對較低的01編碼,來建立最小的帶權路徑長度的樹,來最大化的獲得編碼儲存空間的一種編碼規則。這個樹稱為哈弗曼樹,也稱為最優二叉樹。這樣可以確定每乙個字元的編碼不可能成為其他字元編碼的坐子串...

哈弗曼編碼

include include include define my strmax 100 define infinity 1000000 typedef struct htnode,huffmantree 動態分配陣列儲存赫夫曼樹 typedef char huffmancode 動態分配陣列儲存赫...