เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบญเบ‡เบซเบผเบฑเบเบชเบนเบ” "เบชเบนเบ”เบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบชเปเบฒเบฅเบฑเบšเบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒ" เบเบฒเบ™เบเบฐเบเบฝเบกเบเบฒเบ™เปเบ›เบžเบฒเบชเบฒเบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™เบ—เบตเปˆเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบญเบทเปˆเบ™เบชเปเบฒเบฅเบฑเบšเบ—เปˆเบฒเบ™.

Huffman coding เปเบกเปˆเบ™เบงเบดเบ—เบตเบเบฒเบ™เบšเบตเบšเบญเบฑเบ”เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเป‰เบฒเบ‡เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบšเบตเบšเบญเบฑเบ”เป„เบŸเบฅเปŒ. เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ„เบปเบ‡เบ—เบตเปˆเปเบฅเบฐเบ•เบปเบงเปเบ›, เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบชเบฒเบกเบฒเบ”เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เป„เบ”เป‰เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ, เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ, เปเบฅเบฐเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ Huffman.

เบžเบงเบเป€เบฎเบปเบฒเบฎเบนเป‰เบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เป€เบ›เบฑเบ™เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡ 0's เปเบฅเบฐ 1's เปเบฅเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเป€เบ–เบดเบ‡ 8 bits. เบญเบฑเบ™เบ™เบตเป‰เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบเบฒเบงเบ„เบปเบ‡เบ—เบตเปˆเป€เบžเบฒเบฐเบงเปˆเบฒเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบŠเป‰เบˆเปเบฒเบ™เบงเบ™เบšเบดเบ”เบ„เบปเบ‡เบ—เบตเปˆเบ”เบฝเบงเบเบฑเบ™เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ.

เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบก. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบžเบทเป‰เบ™เบ—เบตเปˆเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบ”เบฝเบงเป„เบ”เป‰เปเบ™เบงเปƒเบ”?

เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ•เบปเป‰เบ™เบ•เปเปเบกเปˆเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ•เบปเบงเปเบ›. เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบšเบฒเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเป€เบเบตเบ”เบ‚เบทเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เบเบงเปˆเบฒเบ•เบปเบงเบญเบทเปˆเบ™ (เป€เบšเบดเปˆเบ‡เบ—เบตเปˆเบ™เบตเป‰) เป€เบžเบทเปˆเบญเบžเบฑเบ”เบ—เบฐเบ™เบฒ algorithm เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบฅเปเบฒเบ”เบฑเบšเบ”เบฝเบงเบเบฑเบ™เบ‚เบญเบ‡เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เปƒเบ™ bits เบซเบ™เป‰เบญเบ. เปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ•เบปเบงเปเบ›, เบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เป€เบ›เบฑเบ™เบˆเปเบฒเบ™เบงเบ™เบ•เบปเบงเปเบ›เบ‚เบญเบ‡ bits, เบ‚เบถเป‰เบ™เบเบฑเบšเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบ›เบฒเบเบปเบ”เบขเบนเปˆเปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ”เบซเบ™เบถเปˆเบ‡. เปƒเบ™เบ—เบตเปˆเบชเบธเบ”, เบšเบฒเบ‡เบ•เบปเบงเบญเบฑเบเบ‚เบฐเบฅเบฐเบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบžเบฝเบ‡ 1 เบšเบดเบ”, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบšเบฒเบ‡เบ•เบปเบงเบญเบฒเบ”เบˆเบฐเปƒเบŠเป‰ 2 เบšเบดเบ”, 3 เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเบ™เบฑเป‰เบ™. เบšเบฑเบ™เบซเบฒเบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ•เบปเบงเปเบ›เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡เบฅเปเบฒเบ”เบฑเบš.

เบงเบดเบ—เบตเบเบฒเบ™, เบเบฒเบ™เบฎเบนเป‰เบฅเปเบฒเบ”เบฑเบšเบ‚เบญเบ‡ bits, เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบกเบฑเบ™ unambiguously?

เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเป€เบชเบฑเป‰เบ™ "abacdab". เบกเบฑเบ™เบกเบต 8 เบ•เบปเบงเบญเบฑเบเบชเบญเบ™, เปเบฅเบฐเป€เบกเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ„เบปเบ‡เบ—เบตเปˆ, เบกเบฑเบ™เบˆเบฐเบ•เป‰เบญเบ‡เบกเบต 64 bits เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบกเบฑเบ™. เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบฅเบฑเบ "a", "b", "c" ะธ "D" เป€เบ—เบปเปˆเบฒเบเบฑเบš 4, 2, 1, 1 เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš. เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™ "abacdab" bits เบซเบ™เป‰เบญเบ, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒ "เป€เบ–เบดเบ‡" เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เบซเบผเบฒเบเบเปˆเบงเบฒ "เบ‚"เปเบฅเบฐ "เบ‚" เป€เบเบตเบ”เบ‚เบถเป‰เบ™เป€เบฅเบทเป‰เบญเบเป†เบซเบผเบฒเบเบเปˆเบงเบฒ "เบ„" ะธ "D". เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” "เป€เบ–เบดเบ‡" เบกเบต bit เป€เบ—เบปเปˆเบฒเบเบฑเบš 0, "เบ‚" เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเปเบฒเบ™เบปเบ”เบฅเบฐเบซเบฑเบ”เบชเบญเบ‡เบšเบดเบ” 11, เปเบฅเบฐเปƒเบŠเป‰เบชเบฒเบกเบšเบดเบ” 100 เปเบฅเบฐ 011 เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”. "เบ„" ะธ "D".

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบš:

a
0

b
11

c
100

d
011

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเบฒเบ "abacdab" เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป€เบ›เบฑเบ™ 00110100011011 (0|0|11|0|100|011|0|11)เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบฅเบฐเบซเบฑเบ”เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบšเบฑเบ™เบซเบฒเบ•เบปเป‰เบ™เบ•เปเบˆเบฐเบขเบนเปˆเปƒเบ™เบเบฒเบ™เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”. เป€เบกเบทเปˆเบญเบžเบงเบเป€เบฎเบปเบฒเบžเบฐเบเบฒเบเบฒเบกเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เบชเบฐเบ•เบฃเบดเบ‡ 00110100011011, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เป„เบ”เป‰:

0|011|0|100|011|0|11    adacdab
0|0|11|0|100|0|11|011   aabacabd
0|011|0|100|0|11|0|11   adacabab 

...
เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เป€เบžเบทเปˆเบญเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบ„เบงเบฒเบกเบšเปเปˆเปเบ™เปˆเบ™เบญเบ™เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบžเปเปƒเบˆเบเบฑเบšเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ™เปเบฒเบซเบ™เป‰เบฒ, เป€เบŠเบดเปˆเบ‡เบซเบกเบฒเบเบ„เบงเบฒเบกเบงเปˆเบฒเบฅเบฐเบซเบฑเบ”เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เปƒเบ™เบงเบดเบ—เบตเบ”เบฝเบงเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ™เปเบฒเบซเบ™เป‰เบฒเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบงเปˆเบฒเบšเปเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เป€เบ›เบฑเบ™เบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒเบ‚เบญเบ‡เบญเบทเปˆเบ™. เป‚เบ”เบเบฅเบฐเบซเบฑเบ”, เบžเบงเบเป€เบฎเบปเบฒเบซเบกเบฒเบเป€เบ–เบดเบ‡เบšเบดเบ”เบ—เบตเปˆเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบฅเบฑเบเบชเบฐเบ™เบฐเบชเบฐเป€เบžเบฒเบฐ. เปƒเบ™เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡ 0 เป€เบ›เบฑเบ™เบ„เบณเบ™เบณเปœเป‰เบฒ 011, เป€เบŠเบดเปˆเบ‡เบฅเบฐเป€เบกเบตเบ”เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™เบ™เปเบฒเบซเบ™เป‰เบฒ. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ–เป‰เบฒเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเบปเบ”เบฅเบฐเบšเบฝเบšเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบ–เบญเบ”เบฅเบฐเบซเบฑเบ”เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบ (เปเบฅเบฐเปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™).

เปƒเบซเป‰เป€เบฎเบปเบฒเบกเบฒเป€เบšเบดเปˆเบ‡เบ•เบปเบงเบขเปˆเบฒเบ‡เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เบ™เบตเป‰. เป€เบงเบฅเบฒเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบเปเบฒเบ™เบปเบ”เบชเปเบฒเบฅเบฑเบšเบชเบฑเบ™เบเบฒเบฅเบฑเบ "a", "b", "c" ะธ "D" เบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบ•เบญเบšเบชเบฐ เปœเบญเบ‡ เบเบปเบ”เบฅเบฐเบšเบฝเบšเบเบฒเบ™ เบ™เบณ เปœเป‰เบฒ.

a
0

b
10

c
110

d
111

เบ”เป‰เบงเบเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ™เบตเป‰, เบชเบฐเบ•เบฃเบดเบ‡ "abacdab" เบˆเบฐเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป€เบ›เบฑเบ™ 00100100011010 (0|0|10|0|100|011|0|10)เบ—เบตเปˆเบขเบนเปˆ เปเบฅเบฐเบ™เบตเป‰ 00100100011010 เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹เบˆเบฐโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เบ–เบญเบ”โ€‹เบฅเบฐโ€‹เบซเบฑเบ” unambiguously เปเบฅเบฐโ€‹เบเบฑเบšโ€‹เบ„เบทเบ™โ€‹เป„เบ›โ€‹เบšเปˆเบญเบ™โ€‹เบชเบฐโ€‹เบ•โ€‹เบฃเบดเบ‡โ€‹เบ•เบปเป‰เบ™โ€‹เบชเบฐโ€‹เบšเบฑเบšโ€‹เบ‚เบญเบ‡โ€‹เบžเบงเบโ€‹เป€เบฎเบปเบฒโ€‹ "abacdab".

Huffman เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ•เบปเบงเปเบ›เปเบฅเบฐเบเบปเบ”เบฅเบฐเบšเบฝเบšเบ„เปเบฒเบ™เปเบฒเบซเบ™เป‰เบฒ, เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” Huffman.

เบงเบดเบ—เบตเบเบฒเบ™เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆ. เปƒเบ™เบกเบฑเบ™, node เบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบเบซเบผเบทเบžเบฒเบเปƒเบ™. เปƒเบ™เป€เบšเบทเป‰เบญเบ‡เบ•เบปเป‰เบ™, nodes เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบ–เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เปƒเบš (terminals), เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ‚เบญเบ‡เบชเบฑเบ™เบเบฒเบฅเบฑเบเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบฅเบฐเบ™เป‰เปเบฒเบซเบ™เบฑเบเบ‚เบญเบ‡เบกเบฑเบ™ (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบง). เป‚เบซเบ™เบ”เบžเบฒเบเปƒเบ™เบกเบตเบ™เปเป‰เบฒเปœเบฑเบเบ‚เบญเบ‡เบ•เบปเบงเบฅเบฐเบ„เบญเบ™ เปเบฅเบฐเปเบฒเบเป€เบ–เบดเบ‡เบชเบญเบ‡เป‚เบซเบ™เบ”เบ—เบตเปˆเบชเบทเบšเบ—เบญเบ”เบเบฑเบ™เบกเบฒ. เป‚เบ”เบเบ‚เปเป‰เบ•เบปเบเบฅเบปเบ‡เบ—เบปเปˆเบงเป„เบ›, bit "0" เป€เบ›เบฑเบ™เบ•เบปเบงเปเบ—เบ™เบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบชเบฒเบ‚เบฒเบŠเป‰เบฒเบ, เปเบฅเบฐ "1" - เบ—เบฒเบ‡โ€‹เบ‚เบงเบฒ. เบขเบนเปˆเปƒเบ™เบ•เบปเป‰เบ™เป„เบกเป‰เป€เบ•เบฑเบก N เปƒเบš เปเบฅเบฐ N-1 nodes เบžเบฒเบเปƒเบ™. เปเบ™เบฐเบ™เบณเบงเปˆเบฒเป€เบกเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ Huffman, เบชเบฑเบ™เบเบฒเบฅเบฑเบเบ—เบตเปˆเบšเปเปˆเป„เบ”เป‰เปƒเบŠเป‰เบˆเบฐเบ–เบทเบเบเบปเบเป€เบฅเบตเบเป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฅเบฐเบซเบฑเบ”เบ„เบงเบฒเบกเบเบฒเบงเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰เปเบ–เบงเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰ Huffman, เบšเปˆเบญเบ™เบ—เบตเปˆ node เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบ–เบตเปˆเบ•เปˆเปเบฒเบชเบธเบ”เบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบชเบนเบ‡เบชเบธเบ”. เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เปเบกเปˆเบ™เป„เบ”เป‰เบญเบฐเบ—เบดเบšเบฒเบเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

  1. เบชเป‰เบฒเบ‡ node เปƒเบšเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบ•เบปเบงเบฅเบฐเบ„เบญเบ™เปเบฅเบฐเป€เบžเบตเปˆเบกเบžเบงเบเบกเบฑเบ™เปƒเบชเปˆเปเบ–เบงเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”.
  2. เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบกเบตเบซเบผเบฒเบเบเบงเปˆเบฒเปœเบถเปˆเบ‡เปเบœเปˆเบ™เบขเบนเปˆเปƒเบ™เปเบ–เบง, เปƒเบซเป‰เป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:
    • เป€เบญเบปเบฒเบชเบญเบ‡ nodes เบ—เบตเปˆเบกเบตเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบชเบนเบ‡เบชเบธเบ” (เบ„เบงเบฒเบกเบ–เบตเปˆเบ•เปˆเปเบฒเบชเบธเบ”) เบญเบญเบเบˆเบฒเบเปเบ–เบง;
    • เบชเป‰เบฒเบ‡ node เบžเบฒเบเปƒเบ™เปƒเบซเบกเปˆ, เบšเปˆเบญเบ™เบ—เบตเปˆเบ—เบฑเบ‡เบชเบญเบ‡ nodes เบˆเบฐเป€เบ›เบฑเบ™เป€เบ”เบฑเบเบ™เป‰เบญเบ, เปเบฅเบฐเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบˆเบฐเป€เบ—เบปเปˆเบฒเบเบฑเบšเบœเบปเบ™เบฅเบงเบกเบ‚เบญเบ‡เบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบ—เบฑเบ‡เบชเบญเบ‡ nodes เบ™เบตเป‰.
    • เป€เบžเบตเปˆเบก node เปƒเปเปˆเปƒเบชเปˆเปเบ–เบงเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”.
  3. เบ‚เปเป‰เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเป€เบ›เบฑเบ™เบฎเบฒเบ, เปเบฅเบฐเบ™เบตเป‰เบˆเบฐเบชเปเบฒเป€เบฅเบฑเบ”เบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡เบ•เบปเป‰เบ™เป„เบกเป‰.

เบˆเบดเบ™เบ•เบฐเบ™เบฒเบเบฒเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบšเบฒเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ•เบปเบงเบญเบฑเบเบชเบญเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ "เบโ€‹เบ‚โ€‹เบ„โ€‹เบ‡" ะธ "เปเบฅเบฐ", เปเบฅเบฐเบ„เบงเบฒเบกเบ–เบตเปˆเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบเบปเบ”เบ•เบปเบงเบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เปเบกเปˆเบ™ 15, 7, 6, 6, เปเบฅเบฐ 5, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš. เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เบฎเบนเบšเบ›เบฐเบเบญเบšเบ—เบตเปˆเบชเบฐเบ—เป‰เบญเบ™เป€เบ–เบดเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบ‚เบญเบ‡ algorithm.

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman

เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡เบˆเบฒเบเบฎเบฒเบเป„เบ›เบซเบฒเบˆเบธเบ”เบชเบดเป‰เบ™เบชเบธเบ”เปƒเบ”เป†เบเปเบ•เบฒเบกเบˆเบฐเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบฅเบฐเบซเบฑเบ” prefix เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ” (เบเบฑเบ‡เป€เบญเบตเป‰เบ™เบงเปˆเบฒเบฅเบฐเบซเบฑเบ” Huffman) เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบš node เบ—เป‰เบฒเบเบ™เบฑเป‰เบ™.

เบชเบนเบ”เบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman
เบ•เบปเป‰เบ™เป„เบกเป‰ Huffman

เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบšเบตเบšเบญเบฑเบ” Huffman เปƒเบ™ C ++ เปเบฅเบฐ Java:

#include <iostream>
#include <string>
#include <queue>
#include <unordered_map>
using namespace std;

// A Tree node
struct Node
{
	char ch;
	int freq;
	Node *left, *right;
};

// Function to allocate a new tree node
Node* getNode(char ch, int freq, Node* left, Node* right)
{
	Node* node = new Node();

	node->ch = ch;
	node->freq = freq;
	node->left = left;
	node->right = right;

	return node;
}

// Comparison object to be used to order the heap
struct comp
{
	bool operator()(Node* l, Node* r)
	{
		// highest priority item has lowest frequency
		return l->freq > r->freq;
	}
};

// traverse the Huffman Tree and store Huffman Codes
// in a map.
void encode(Node* root, string str,
			unordered_map<char, string> &huffmanCode)
{
	if (root == nullptr)
		return;

	// found a leaf node
	if (!root->left && !root->right) {
		huffmanCode[root->ch] = str;
	}

	encode(root->left, str + "0", huffmanCode);
	encode(root->right, str + "1", huffmanCode);
}

// traverse the Huffman Tree and decode the encoded string
void decode(Node* root, int &index, string str)
{
	if (root == nullptr) {
		return;
	}

	// found a leaf node
	if (!root->left && !root->right)
	{
		cout << root->ch;
		return;
	}

	index++;

	if (str[index] =='0')
		decode(root->left, index, str);
	else
		decode(root->right, index, str);
}

// Builds Huffman Tree and decode given input text
void buildHuffmanTree(string text)
{
	// count frequency of appearance of each character
	// and store it in a map
	unordered_map<char, int> freq;
	for (char ch: text) {
		freq[ch]++;
	}

	// Create a priority queue to store live nodes of
	// Huffman tree;
	priority_queue<Node*, vector<Node*>, comp> pq;

	// Create a leaf node for each character and add it
	// to the priority queue.
	for (auto pair: freq) {
		pq.push(getNode(pair.first, pair.second, nullptr, nullptr));
	}

	// do till there is more than one node in the queue
	while (pq.size() != 1)
	{
		// Remove the two nodes of highest priority
		// (lowest frequency) from the queue
		Node *left = pq.top(); pq.pop();
		Node *right = pq.top();	pq.pop();

		// Create a new internal node with these two nodes
		// as children and with frequency equal to the sum
		// of the two nodes' frequencies. Add the new node
		// to the priority queue.
		int sum = left->freq + right->freq;
		pq.push(getNode('', sum, left, right));
	}

	// root stores pointer to root of Huffman Tree
	Node* root = pq.top();

	// traverse the Huffman Tree and store Huffman Codes
	// in a map. Also prints them
	unordered_map<char, string> huffmanCode;
	encode(root, "", huffmanCode);

	cout << "Huffman Codes are :n" << 'n';
	for (auto pair: huffmanCode) {
		cout << pair.first << " " << pair.second << 'n';
	}

	cout << "nOriginal string was :n" << text << 'n';

	// print encoded string
	string str = "";
	for (char ch: text) {
		str += huffmanCode[ch];
	}

	cout << "nEncoded string is :n" << str << 'n';

	// traverse the Huffman Tree again and this time
	// decode the encoded string
	int index = -1;
	cout << "nDecoded string is: n";
	while (index < (int)str.size() - 2) {
		decode(root, index, str);
	}
}

// Huffman coding algorithm
int main()
{
	string text = "Huffman coding is a data compression algorithm.";

	buildHuffmanTree(text);

	return 0;
}

import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;

// A Tree node
class Node
{
	char ch;
	int freq;
	Node left = null, right = null;

	Node(char ch, int freq)
	{
		this.ch = ch;
		this.freq = freq;
	}

	public Node(char ch, int freq, Node left, Node right) {
		this.ch = ch;
		this.freq = freq;
		this.left = left;
		this.right = right;
	}
};

class Huffman
{
	// traverse the Huffman Tree and store Huffman Codes
	// in a map.
	public static void encode(Node root, String str,
							  Map<Character, String> huffmanCode)
	{
		if (root == null)
			return;

		// found a leaf node
		if (root.left == null && root.right == null) {
			huffmanCode.put(root.ch, str);
		}


		encode(root.left, str + "0", huffmanCode);
		encode(root.right, str + "1", huffmanCode);
	}

	// traverse the Huffman Tree and decode the encoded string
	public static int decode(Node root, int index, StringBuilder sb)
	{
		if (root == null)
			return index;

		// found a leaf node
		if (root.left == null && root.right == null)
		{
			System.out.print(root.ch);
			return index;
		}

		index++;

		if (sb.charAt(index) == '0')
			index = decode(root.left, index, sb);
		else
			index = decode(root.right, index, sb);

		return index;
	}

	// Builds Huffman Tree and huffmanCode and decode given input text
	public static void buildHuffmanTree(String text)
	{
		// count frequency of appearance of each character
		// and store it in a map
		Map<Character, Integer> freq = new HashMap<>();
		for (int i = 0 ; i < text.length(); i++) {
			if (!freq.containsKey(text.charAt(i))) {
				freq.put(text.charAt(i), 0);
			}
			freq.put(text.charAt(i), freq.get(text.charAt(i)) + 1);
		}

		// Create a priority queue to store live nodes of Huffman tree
		// Notice that highest priority item has lowest frequency
		PriorityQueue<Node> pq = new PriorityQueue<>(
										(l, r) -> l.freq - r.freq);

		// Create a leaf node for each character and add it
		// to the priority queue.
		for (Map.Entry<Character, Integer> entry : freq.entrySet()) {
			pq.add(new Node(entry.getKey(), entry.getValue()));
		}

		// do till there is more than one node in the queue
		while (pq.size() != 1)
		{
			// Remove the two nodes of highest priority
			// (lowest frequency) from the queue
			Node left = pq.poll();
			Node right = pq.poll();

			// Create a new internal node with these two nodes as children 
			// and with frequency equal to the sum of the two nodes
			// frequencies. Add the new node to the priority queue.
			int sum = left.freq + right.freq;
			pq.add(new Node('', sum, left, right));
		}

		// root stores pointer to root of Huffman Tree
		Node root = pq.peek();

		// traverse the Huffman tree and store the Huffman codes in a map
		Map<Character, String> huffmanCode = new HashMap<>();
		encode(root, "", huffmanCode);

		// print the Huffman codes
		System.out.println("Huffman Codes are :n");
		for (Map.Entry<Character, String> entry : huffmanCode.entrySet()) {
			System.out.println(entry.getKey() + " " + entry.getValue());
		}

		System.out.println("nOriginal string was :n" + text);

		// print encoded string
		StringBuilder sb = new StringBuilder();
		for (int i = 0 ; i < text.length(); i++) {
			sb.append(huffmanCode.get(text.charAt(i)));
		}

		System.out.println("nEncoded string is :n" + sb);

		// traverse the Huffman Tree again and this time
		// decode the encoded string
		int index = -1;
		System.out.println("nDecoded string is: n");
		while (index < sb.length() - 2) {
			index = decode(root, index, sb);
		}
	}

	public static void main(String[] args)
	{
		String text = "Huffman coding is a data compression algorithm.";

		buildHuffmanTree(text);
	}
}

เบซเบกเบฒเบเป€เบซเบ”: เบซเบ™เปˆเบงเบเบ„เบงเบฒเบกเบˆเปเบฒเบ—เบตเปˆเปƒเบŠเป‰เป‚เบ”เบเบชเบฐเบ•เบฃเบดเบ‡เบ›เป‰เบญเบ™เบ‚เปเป‰เบกเบนเบ™เปเบกเปˆเบ™ 47 * 8 = 376 bits เปเบฅเบฐ string เบ—เบตเปˆเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆ 194 bits i.e. เบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบšเบตเบšเบญเบฑเบ”เบ›เบฐเบกเบฒเบ™ 48%. เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™ C ++ เบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ string class เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒ string เบ—เบตเปˆเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰เป‚เบ„เบ‡เบเบฒเบ™เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป„เบ”เป‰.

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบ–เบงเบšเบนเบฅเบดเบกเบฐเบชเบดเบ”เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เปเปˆเบเบฒเบ™เปเบŠเบ O(log(N)) เบ—เบตเปˆโ€‹เปƒเบŠเป‰โ€‹เป€เบงโ€‹เบฅเบฒโ€‹, เปเบ•เปˆโ€‹เบงเปˆเบฒโ€‹เปƒเบ™โ€‹เบ•เบปเป‰เบ™โ€‹เป„เบกเป‰โ€‹เบ„เบนเปˆโ€‹เบชเบปเบกโ€‹เบšเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹ N เปƒเบšเบ›เบฐเบˆเบธเบšเบฑเบ™ 2N-1 nodes, เปเบฅเบฐเบ•เบปเป‰เบ™เป„เบกเป‰ Huffman เปเบกเปˆเบ™เบ•เบปเป‰เบ™เป„เบกเป‰เบ„เบนเปˆเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ algorithm เปเบฅเปˆเบ™เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™ O(Nlog(N)) เป€เบงเบฅเบฒ, เบขเบนเปˆเปƒเบช N - เบฅเบฑเบเบชเบฐเบ™เบฐ.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™:

en.wikipedia.org/wiki/Huffman_coding
en.wikipedia.org/wiki/Variable-length_code
www.youtube.com/watch?v=5wRPin4oxCo

เบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบซเบผเบฑเบเบชเบนเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™