Skip to content

yaBorn/Dynamic-Huffman-coding

Repository files navigation

Dynamic-Huffman-coding

【C++】自适应哈夫曼编码

TODO:

  1. 文档编写ing

编码器执行过程

==========编码器载入码表:* A B C D
==========开始编码:AADCCDD
长度:7

输入 第1个字符:A
首次编码
到达叶子:* 更新值:0->0
到达叶子:A 更新值:00001->1
输出序列:0 00001

输入 第2个字符:A
获得指针:A
到达叶子:* 更新值:0->0
到达叶子:A 更新值:1->1
输出序列:0 00001 1

输入 第3个字符:D
首次编码
到达叶子:* 更新值:0->00
到达叶子:D 更新值:00100->01
到达叶子:A 更新值:1->1
输出序列:0 00001 1 0 00100

输入 第4个字符:C
首次编码
到达叶子:* 更新值:00->000
到达叶子:C 更新值:00011->001
到达叶子:D 更新值:01->01
到达叶子:A 更新值:1->1
输出序列:0 00001 1 0 00100 00 00011

输入 第5个字符:C
获得指针:C
到达叶子:A 更新值:1->0
到达叶子:* 更新值:000->100
到达叶子:D 更新值:01->101
到达叶子:C 更新值:001->11
输出序列:0 00001 1 0 00100 00 00011 001

输入 第6个字符:D
获得指针:D
到达叶子:A 更新值:0->0
到达叶子:* 更新值:100->100
到达叶子:D 更新值:101->101
到达叶子:C 更新值:11->11
输出序列:0 00001 1 0 00100 00 00011 001 101

输入 第7个字符:D
获得指针:D
到达叶子:A 更新值:0->0
到达叶子:* 更新值:100->100
到达叶子:C 更新值:11->101
到达叶子:D 更新值:101->11
输出序列:0 00001 1 0 00100 00 00011 001 101 101

解码器执行过程

==========解码器载入码表:* A B C D
==========开始解码:0 00001 1 0 00100 00 00011 001 101 101
长度:10

输入 第1个字符:0
为NEW位

输入 第2个字符:00001
对应字符为:A
到达叶子:* 更新值:0->0
到达叶子:A 更新值:00001->1
解码字符串:A

输入 第3个字符:1
获得指针:A
到达叶子:* 更新值:0->0
到达叶子:A 更新值:1->1
解码字符串:AA

输入 第4个字符:0
为NEW位

输入 第5个字符:00100
对应字符为:D
到达叶子:* 更新值:0->00
到达叶子:D 更新值:00100->01
到达叶子:A 更新值:1->1
解码字符串:AAD

输入 第6个字符:00
为NEW位

输入 第7个字符:00011
对应字符为:C
到达叶子:* 更新值:00->000
到达叶子:C 更新值:00011->001
到达叶子:D 更新值:01->01
到达叶子:A 更新值:1->1
解码字符串:AADC

输入 第8个字符:001
获得指针:C
到达叶子:A 更新值:1->0
到达叶子:* 更新值:000->100
到达叶子:D 更新值:01->101
到达叶子:C 更新值:001->11
解码字符串:AADCC

输入 第9个字符:101
获得指针:D
到达叶子:A 更新值:0->0
到达叶子:* 更新值:100->100
到达叶子:D 更新值:101->101
到达叶子:C 更新值:11->11
解码字符串:AADCCD

输入 第10个字符:101
获得指针:D
到达叶子:A 更新值:0->0
到达叶子:* 更新值:100->100
到达叶子:C 更新值:11->101
到达叶子:D 更新值:101->11
解码字符串:AADCCDD