αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆ "αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž’αž—αž·αžœαžŒαŸ’αžαž“αŸ" αž”αžΆαž“αžšαŸ€αž”αž…αŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αž“αž€αž“αžΌαžœαž€αžΆαžšαž”αž€αž”αŸ’αžšαŸ‚αž“αŸƒαžŸαž˜αŸ’αž—αžΆαžšαŸˆαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαŸ”

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠ Huffman αž‚αžΊαž‡αžΆαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž‚αŸ†αž“αž·αžαž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž“αŸƒαž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹αž―αž€αžŸαžΆαžšαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αž™αžΎαž„αž“αžΉαž„αž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αžαŸαžš αž“αž·αž„αž’αžαŸαžš αž›αŸαžαž€αžΌαžŠαžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ„αŸ‡αž€αžΌαžŠαž”αžΆαž“αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹ αž…αŸ’αž”αžΆαž”αŸ‹αž”αž»αž–αŸ’αžœαž”αž‘ αž“αž·αž„αž€αžΆαžšαž€αžŸαžΆαž„αž˜αŸ‚αž€αž’αžΆαž„ Huffman αŸ”

αž™αžΎαž„αžŠαžΉαž„αžαžΆαžαž½αž’αž€αŸ’αžŸαžšαž“αžΈαž˜αž½αž™αŸ—αžαŸ’αžšαžΌαžœαž”αžΆαž“αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž‡αžΆαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒ 0 αž“αž·αž„ 1 αž αžΎαž™αž™αž€ 8 αž”αŸŠαžΈαžαŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαž αŸ…αžαžΆαž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αžαŸαžš αž–αžΈαž–αŸ’αžšαŸ„αŸ‡αžαž½αž’αž€αŸ’αžŸαžšαž“αžΈαž˜αž½αž™αŸ—αž”αŸ’αžšαžΎαž…αŸ†αž“αž½αž“αž”αŸŠαžΈαžαžαŸαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αŸ”

αž§αž”αž˜αžΆαžαžΆαž™αžΎαž„αž˜αžΆαž“αž’αžαŸ’αžαž”αž‘αŸ” αžαžΎβ€‹αž™αžΎαž„β€‹αž’αžΆαž…β€‹αž€αžΆαžαŸ‹β€‹αž”αž“αŸ’αžαž™β€‹αž‘αŸ†αž αŸ†β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž€αžΆαžšβ€‹αžŠαžΎαž˜αŸ’αž”αžΈβ€‹αž‘αž»αž€β€‹αžαž½αž’αž€αŸ’αžŸαžšβ€‹αž˜αž½αž™β€‹αžŠαŸ„αž™β€‹αžšαž”αŸ€αž”β€‹αžŽαžΆ?

αž‚αŸ†αž“αž·αžαž…αž˜αŸ’αž”αž„αž‚αžΊαž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αž’αžαŸαžšαŸ” αž™αžΎαž„αž’αžΆαž…αž”αŸ’αžšαžΎαž€αžΆαžšαž–αž·αžαžŠαŸ‚αž›αžαžΆαžαž½αž’αž€αŸ’αžŸαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž€αžΎαžαž‘αžΎαž„αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž‡αžΆαž„αž’αŸ’αž“αž€αžŠαž‘αŸƒ (αžŸαžΌαž˜αž˜αžΎαž›αž“αŸ…αž‘αžΈαž“αŸαŸ‡) αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžŠαŸ‚αž›αž“αžΉαž„αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž›αŸ†αžŠαžΆαž”αŸ‹αžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸƒαžαž½αž’αž€αŸ’αžŸαžšαž€αŸ’αž“αž»αž„αž”αŸŠαžΈαžαžαž·αž…αž‡αžΆαž„αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αž’αžαŸαžš αž™αžΎαž„αž€αŸ†αžŽαžαŸ‹αžαž½αž’αž€αŸ’αžŸαžšαž“αžΌαžœαž…αŸ†αž“αž½αž“αž’αžαŸαžšαž“αŸƒαž”αŸŠαžΈαž αž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαžαžΆαžαžΎαž–αž½αž€αžœαžΆαž›αŸαž…αž‘αžΎαž„αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αžŠαŸ‚αž›αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αŸ” αž“αŸ…αž‘αžΈαž”αŸ†αž•αž»αž αžαž½αž’αž€αŸ’αžŸαžšαžαŸ’αž›αŸ‡αž’αžΆαž…αž”αŸ’αžšαžΎ 1 αž”αŸŠαžΈαž αžαžŽαŸˆαžαŸ’αž›αŸ‡αž‘αŸ€αžαž’αžΆαž…αž”αŸ’αžšαžΎ 2 αž”αŸŠαžΈαž 3 αž¬αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž“αŸαŸ‡αŸ” αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αž’αžαŸαžšαž‚αžΊαž˜αžΆαž“αžαŸ‚αž€αžΆαžšαžŒαž·αž€αžΌαžŠαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹αž“αŸƒαž›αŸ†αžŠαžΆαž”αŸ‹αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ”

αžŠαŸ„αž™β€‹αžŠαžΉαž„β€‹αž›αŸ†αžŠαžΆαž”αŸ‹β€‹αž“αŸƒβ€‹αž”αŸŠαžΈαž αžŒαž·αž€αžΌαžŠβ€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž›αžΆαžŸαŸ‹β€‹αžŠαŸ„αž™β€‹αžšαž”αŸ€αž”β€‹αžŽαžΆ?

αž–αž·αž…αžΆαžšαžŽαžΆαž”αž“αŸ’αž‘αžΆαžαŸ‹ "αž’αžΆαž”αžΆαžŠαžΆαž”". αžœαžΆαž˜αžΆαž“ 8 αžαž½αž’αž€αŸ’αžŸαžš αž αžΎαž™αž“αŸ…αž–αŸαž›αž’αŸŠαž·αž“αž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αžαŸαžš αžœαžΆαž“αžΉαž„αžαŸ’αžšαžΌαžœαž€αžΆαžš 64 αž”αŸŠαžΈαžαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αžœαžΆαŸ” αž…αŸ†αžŽαžΆαŸ†αžαžΆαž”αŸ’αžšαŸαž€αž„αŸ‹αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆ "a", "b", "c" ΠΈ "αžƒ" αžŸαŸ’αž˜αžΎαž“αžΉαž„ 4, 2, 1, 1 αžšαŸ€αž„αŸ—αžαŸ’αž›αž½αž“αŸ” αžαŸ„αŸ‡αžŸαžΆαž€αžŸαŸ’αžšαž˜αŸƒαž˜αžΎαž› "αž’αžΆαž”αžΆαžŠαžΆαž”" αž”αŸŠαžΈαžαžαž·αž…αž‡αžΆαž„ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αžΆαžšαž–αž·αž "αž‘αŸ…" αž€αžΎαžαž‘αžΎαž„αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž‡αžΆαž„ "ខ"αž“αž·αž„ "ខ" αž€αžΎαžαž‘αžΎαž„αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž‡αžΆαž„ "αž‚" ΠΈ "αžƒ". αž…αžΌαžšαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αžŠαŸ„αž™αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠ "αž‘αŸ…" αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸŠαžΈαžαž˜αž½αž™αžŸαŸ’αž˜αžΎαž“αžΉαž„ 0, "ខ" αž™αžΎαž„αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž›αŸαžαž€αžΌαžŠαž–αžΈαžšαž”αŸŠαžΈαž 11 αž αžΎαž™αžŠαŸ„αž™αž”αŸ’αžšαžΎαž”αžΈαž”αŸŠαžΈαž 100 αž“αž·αž„ 011 αž™αžΎαž„αž“αžΉαž„αž’αŸŠαž·αž“αž€αžΌαžŠ "αž‚" ΠΈ "αžƒ".

αž‡αžΆαž›αž‘αŸ’αž’αž•αž›αž™αžΎαž„αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αŸ–

a
0

b
11

c
100

d
011

αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž”αž“αŸ’αž‘αžΆαžαŸ‹ "αž’αžΆαž”αžΆαžŠαžΆαž”" αž™αžΎαž„αž“αžΉαž„αž’αŸŠαž·αž“αž€αžΌαžŠαž‡αžΆ 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" ΠΈ "αžƒ" αž€αžΌαžŠβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž“αžΉαž„β€‹αž…αŸ’αž”αžΆαž”αŸ‹β€‹αž”αž»αž–αŸ’αžœαž”αž‘αŸ”

a
0

b
10

c
110

d
111

αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž’αŸŠαž·αž“αž€αžΌαžŠαž“αŸαŸ‡ αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžš "αž’αžΆαž”αžΆαžŠαžΆαž”" αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸŠαž·αž“αž€αžΌαžŠαž‡αžΆ 00100100011010 (0|0|10|0|100|011|0|10)αŸ” αž αžΎαž™αž“αŸ…αž‘αžΈαž“αŸαŸ‡ 00100100011010 αž™αžΎαž„β€‹αž“αžΉαž„β€‹αž’αžΆαž…β€‹αžŒαž·αž€αžΌαžŠβ€‹αžŠαŸ„αž™β€‹αž˜αž·αž“β€‹αž…αŸ’αž”αžΆαžŸαŸ‹β€‹αž›αžΆαžŸαŸ‹β€‹αžšαž½αž…β€‹αž αžΎαž™β€‹αžαŸ’αžšαž‘αž”αŸ‹β€‹αž‘αŸ…β€‹αžαŸ’αžŸαŸ‚β€‹αž’αž€αŸ’αžŸαžšβ€‹αžŠαžΎαž˜β€‹αžšαž”αžŸαŸ‹β€‹αž™αžΎαž„ "αž’αžΆαž”αžΆαžŠαžΆαž”".

αž€αžΆαžšαžŸαžšαžŸαŸαžšαž€αžΌαžŠ Haffman

αž₯αž‘αžΌαžœβ€‹αž“αŸαŸ‡β€‹αž™αžΎαž„β€‹αž”αžΆαž“β€‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™β€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„β€‹αž€αžΆαžšβ€‹αž”αŸ†αž”αŸ’αž›αŸ‚αž„β€‹αž”αŸ’αžšαžœαŸ‚αž„β€‹αž’αžαŸαžš αž“αž·αž„β€‹αž€αŸ’αž”αž½αž“β€‹αž”αž»αž–αŸ’αžœαž”αž‘ αžŸαžΌαž˜β€‹αž“αž·αž™αžΆαž™β€‹αž’αŸ†αž–αžΈβ€‹αž€αžΆαžšβ€‹αž’αŸŠαž·αž“αž€αžΌαžŠ Huffman αŸ”

αžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžšαŸ’αžαž‚αžΊαž•αŸ’αž’αŸ‚αž€αž›αžΎαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαžŠαžΎαž˜αžˆαžΎαž‚αŸ„αž›αž–αžΈαžšαŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαžαŸ’αž“αžΆαŸ†αž„αž’αžΆαž…αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž¬αžαžΆαž„αž€αŸ’αž“αž»αž„αŸ” αžŠαŸ†αž”αžΌαž„αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αžΆαžαŸ‹αž‘αž»αž€αžαžΆαž‡αžΆαžŸαŸ’αž›αžΉαž€ (αžŸαŸ’αžαžΆαž“αžΈαž™) αžŠαŸ‚αž›αžαŸ†αžŽαžΆαž„αž±αŸ’αž™αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžαŸ’αž›αž½αž“αžœαžΆαž“αž·αž„αž‘αž˜αŸ’αž„αž“αŸ‹αžšαž”αžŸαŸ‹αžœαžΆ (αž“αŸ„αŸ‡αž‚αžΊαž—αžΆαž–αž‰αžΉαž€αž‰αžΆαž”αŸ‹αž“αŸƒαž€αžΆαžšαž€αžΎαžαž‘αžΎαž„) αŸ” αžαŸ’αž“αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αž“αž»αž„αž˜αžΆαž“αž‘αž˜αŸ’αž„αž“αŸ‹αž“αŸƒαžαž½αž’αž€αŸ’αžŸαžš αž αžΎαž™αž™αŸ„αž„αž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž”αž“αŸ’αžαž–αžΌαž‡αž–αžΈαžšαŸ” αžŠαŸ„αž™αž€αž·αž…αŸ’αž…αž–αŸ’αžšαž˜αž–αŸ’αžšαŸ€αž„αž‘αžΌαž‘αŸ…, αž”αŸŠαžΈαž "0" αžαŸ†αžŽαžΆαž„β€‹αž±αŸ’αž™β€‹αžαžΆαž„β€‹αž€αŸ’αžšαŸ„αž˜β€‹αžŸαžΆαžαžΆβ€‹αžαžΆαž„β€‹αž†αŸ’αžœαŸαž„ αž“αž·αž„ "1" - αž“αŸ…αžαžΆαž„αžŸαŸ’αžαžΆαŸ†αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αžŠαžΎαž˜αžˆαžΎαž–αŸαž‰ N αžŸαŸ’αž›αžΉαž€αž“αž·αž„ N-1 αžαŸ’αž“αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αž“αž»αž„αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŽαŸ‚αž“αžΆαŸ†αžαžΆαž“αŸ…αž–αŸαž›αžŸαžΆαž„αžŸαž„αŸ‹αž˜αŸ‚αž€αž’αžΆαž„ Huffman αž“αž·αž˜αž·αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŠαŸ‚αž›αž˜αž·αž“αž”αŸ’αžšαžΎαžαŸ’αžšαžΌαžœαž”αŸ„αŸ‡αž…αŸ„αž›αžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“αž›αŸαžαž€αžΌαžŠαž”αŸ’αžšαžœαŸ‚αž„αžŠαŸαž›αŸ’αž’αž”αŸ’αžšαžŸαžΎαžšαŸ”

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž‡αž½αžšαž’αžΆαž‘αž·αž—αžΆαž–αžŠαžΎαž˜αŸ’αž”αžΈαžŸαžΆαž„αžŸαž„αŸ‹αž˜αŸ‚αž€αž’αžΆαž„ Huffman αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž˜αžΆαž“αž”αŸ’αžšαŸαž€αž„αŸ‹αž‘αžΆαž”αž”αŸ†αž•αž»αžαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž’αžΆαž‘αž·αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αžαŸ” αž‡αŸ†αž αžΆαž“αžŸαžΆαž„αžŸαž„αŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜:

  1. αž”αž„αŸ’αž€αžΎαžαžαŸ’αž“αžΆαŸ†αž„αžŸαŸ’αž›αžΉαž€αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαž½αž’αž€αŸ’αžŸαžšαž“αžΈαž˜αž½αž™αŸ— αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž–αž½αž€αžœαžΆαž‘αŸ…αž‡αž½αžšαž’αžΆαž‘αž·αž—αžΆαž–αŸ”
  2. αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž“αŸ’αž›αžΉαž€αž…αŸ’αžšαžΎαž“αž‡αžΆαž„αž˜αž½αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‡αž½αžš αžŸαžΌαž˜αž’αŸ’αžœαžΎαžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–
    • αžŠαž€αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαžŠαŸ‚αž›αž˜αžΆαž“αž’αžΆαž‘αž·αž—αžΆαž–αžαŸ’αž–αžŸαŸ‹αž”αŸ†αž•αž»αž (αž”αŸ’αžšαŸαž€αž„αŸ‹αž‘αžΆαž”αž”αŸ†αž•αž»αž) αž…αŸαž‰αž–αžΈαž‡αž½αžšαŸ”
    • αž”αž„αŸ’αž€αžΎαžαžαŸ’αž“αžΆαŸ†αž„αžαžΆαž„αž€αŸ’αž“αž»αž„αžαŸ’αž˜αžΈαž˜αž½αž™ αžŠαŸ‚αž›αžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡αž“αžΉαž„αž€αŸ’αž›αžΆαž™αž‡αžΆαž€αžΌαž“ αž αžΎαž™αž”αŸ’αžšαŸαž€αž„αŸ‹αž“αŸƒαž€αžΆαžšαž€αžΎαžαž‘αžΎαž„αž“αžΉαž„αžŸαŸ’αž˜αžΎαž“αžΉαž„αž•αž›αž”αžΌαž€αž“αŸƒαž”αŸ’αžšαŸαž€αž„αŸ‹αž“αŸƒαžαŸ’αž“αžΆαŸ†αž„αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αŸαŸ‡αŸ”
    • αž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αž“αžΆαŸ†αž„αžαŸ’αž˜αžΈαž‘αŸ…αž‡αž½αžšαž’αžΆαž‘αž·αž—αžΆαž–αŸ”
  3. αžαŸ’αž“αžΆαŸ†αž„αžŠαŸ‚αž›αž“αŸ…αžŸαŸαžŸαžŸαž›αŸ‹αžαŸ‚αž˜αž½αž™αž‚αžαŸ‹αž“αžΉαž„αž‡αžΆαž«αžŸ αž αžΎαž™αž“αŸαŸ‡αž“αžΉαž„αž”αž‰αŸ’αž…αž”αŸ‹αž€αžΆαžšαžŸαžΆαž„αžŸαž„αŸ‹αž˜αŸ‚αž€αž’αžΆαž„αŸ”

αžŸαŸ’αžšαž˜αŸƒαžαžΆαž™αžΎαž„αž˜αžΆαž“αž’αžαŸ’αžαž”αž‘αžαŸ’αž›αŸ‡αžŠαŸ‚αž›αž˜αžΆαž“αžαŸ‚αžαž½αž’αž€αŸ’αžŸαžšαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” "a", "b", "c", "d" ΠΈ "αž“αž·αž„"αž αžΎαž™αž”αŸ’αžšαŸαž€αž„αŸ‹αž“αŸƒαž€αžΆαžšαž€αžΎαžαž‘αžΎαž„αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαž‚αžΊ 15, 7, 6, 6 αž“αž·αž„ 5 αžšαŸ€αž„αž‚αŸ’αž“αžΆαŸ” αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αž‡αžΆαžšαžΌαž”αž—αžΆαž–αžŠαŸ‚αž›αž†αŸ’αž›αž»αŸ‡αž”αž‰αŸ’αž…αžΆαŸ†αž„αž–αžΈαž‡αŸ†αž αžΆαž“αž“αŸƒαž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αŸ”

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ Huffman

αž•αŸ’αž›αžΌαžœαž–αžΈαž«αžŸαž‘αŸ…αžαŸ’αž“αžΆαŸ†αž„αž…αž»αž„αžŽαžΆαž˜αž½αž™αž“αžΉαž„αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΌαžŠαž”αž»αž–αŸ’αžœαž”αž‘αž›αŸ’αž’αž”αŸ†αž•αž»αž (αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αŸαžŸαŸ’αž‚αžΆαž›αŸ‹αžαžΆαž‡αžΆαž€αžΌαžŠ Huffman) αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž‘αŸ…αž“αžΉαž„αžαž½αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž—αŸ’αž‡αžΆαž”αŸ‹αž‡αžΆαž˜αž½αž™αžαŸ’αž“αžΆαŸ†αž„αž”αž‰αŸ’αž…αž”αŸ‹αž“αŸ„αŸ‡αŸ”

αž€αŸ’αž”αž½αž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž€αžΆαžšαž”αž„αŸ’αž αžΆαž”αŸ‹ 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 αž”αŸŠαžΈαž αž αžΎαž™αžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž€αžΌαžŠαž‚αžΊαž˜αžΆαž“αžαŸ‚ 194 αž”αŸŠαžΈαžαž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡ 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

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹