案例講解 哈夫曼編碼的使用

2021-08-19 08:33:09 字數 3786 閱讀 7327

下面模擬對原文本進行編碼,然後傳輸後,進行相應的解析得到原有的資料,真個過程也可以看作是乙個典型的壓縮、解壓縮操作,具體演示**如下:

#include typedef struct input

input;

void test(input test, char code[21]);

void main()

; //資料的編碼0-52

char text[5][50] = ; //本來的文字內容

int value[5][50] = ; //轉化後的資料值

for (int i = 0; i < 53; i++)

for (int i = 0; i < 5; i++)

for (int i = 0; i < 5; i++)

else if (text[i][j] == 0)

else

}} int diff[5][50] = ; //diff變換得到的值,為傳輸創造條件

for (int j = 0; j < 50; j++)diff[0][j] = value[0][j];

for (int i = 1; i < 5; i++) }

int data[10000] = ;

int len = 0;

for (int i = 0; i < 5; i++)

}} unsigned char finaldata[10000] = ;

int flen = 0;

for (int i = 0; i < len / 8 + 1; i++)

input inputdata = ;

inputdata.len = flen;

inputdata.data = finaldata;

test(inputdata, code);

}typedef struct tree

tree;

tree node[1000] = ; //預設表示沒有左右子節點及資料值

int pnodeuse; //預設有了乙個父節點,並且沒有資料在裡面

int info[10000] = ;

int g_info_len = 0;

int diff[5 * 50];

int g_diff_len = 0;

int diff_array[5][50];

int source_value[5][50];

char source_text[5][50];

void init();

void creathufftree(char code[21]);

void recoverdata(input input);

void decodehuff();

void transdiffarray();

void decodediff();

void decodevalue();

void show();

void test(input test, char code[21])

void init()

pnodeuse = 1;

}void creathufftree(char code[21])

else

}else if (code[i][j] == '1')

else

}else

}//額外的新增長度

if (j == 21)

}}void recoverdata(input input)

g_info_len = flen;

}void decodehuff()

if (info[i] == 1)

if (node[pcurrentnode].data != -1) //有值的話記錄

} }void transdiffarray() }}

void decodediff() }}

void decodevalue()

else

} }}

void show()

printf("\n");

}}

其中輸入input.txt如下:

111100101 0

1011010111101 1

11011110100011 2

1100110101011101 3

11100110 4

110010101011011 5

10011111111111111111 6

00101011011111011 7

010010101110111 8

0010000110101 9

00011010101111 10

001101010101101 11

0000110101101 12

000010101010 13

00000001 14

000000001 15

010010101111101 16

1001110101011111 17

11001100110011001 18

1110011100011100 19

1111100000111 20

1111111000000000 21

101011100101011001 22

10000000000000001 23

11111100000001 24

111111100000001001 25

1111000101 26

10110100111101 27

110111100100011 28

11001101001011101 29

111000110 30

1100100101011011 31

100111110111111111111 32

001010110011111011 33

0100101011010111 34

00100001010101 35

000110101011011 36

0011010101010101 37

00001100101101 38

0000101010010 39

0000000001 40

00000000001 41

0100101011101101 42

10011101010111101 43

110011001100110001 44

10110011100011100 45

11111000000111 46

11111101000000000 47

1010101100101011001 48

100000000000000001 49

101111100000001 50

1111101100000001001 51

111111111111111111 52

hello everyone in professional code test group

this is a ****** case for huffman tree

you will see this text if your code is correct

otherwise you need check your code again

good luck for everyone please do your best

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...