เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เช…เชญเซเชฏเชพเชธเช•เซเชฐเชฎเชจเซ€ เชถเชฐเซ‚เช†เชค เชชเชนเซ‡เชฒเชพเช‚ "เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชฎเชพเชŸเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธ" เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เช…เชจเซเชฏ เช‰เชชเชฏเซ‹เช—เซ€ เชธเชพเชฎเช—เซเชฐเซ€เชจเซ‹ เช…เชจเซเชตเชพเชฆ เชคเซˆเชฏเชพเชฐ เช•เชฐเซเชฏเซ‹ เช›เซ‡.

เชนเชซเชฎเซ‡เชจ เช•เซ‹เชกเชฟเช‚เช— เช เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชเชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช›เซ‡ เชœเซ‡ เชซเชพเช‡เชฒ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจเชจเซ‹ เชฎเซ‚เชณเชญเซ‚เชค เชตเชฟเชšเชพเชฐ เชฌเชจเชพเชตเซ‡ เช›เซ‡. เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ เชจเชฟเชถเซเชšเชฟเชค เช…เชจเซ‡ เชšเชฒ เชฒเช‚เชฌเชพเชˆเชจเชพ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—, เชตเชฟเชถเชฟเชทเซเชŸ เชฐเซ€เชคเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเซ€ เชถเช•เชพเชฏ เชคเซ‡เชตเชพ เช•เซ‹เชกเซเชธ, เช‰เชชเชธเชฐเซเช— เชจเชฟเชฏเชฎเซ‹ เช…เชจเซ‡ เชนเชซเชฎเซ‡เชจ เชŸเซเชฐเซ€ เชฌเชจเชพเชตเชตเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถเซเช‚.

เช†เชชเชฃเซ‡ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐ 0 เช…เชจเซ‡ 1 เชจเชพ เช•เซเชฐเชฎ เชคเชฐเซ€เช•เซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ 8 เชฌเชฟเชŸเซเชธ เชฒเซ‡ เช›เซ‡. เช†เชจเซ‡ เชซเชฟเช•เซเชธเซเชก เชฒเซ‡เชจเซเชฅ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชจเชฟเชถเซเชšเชฟเชค เชธเช‚เช–เซเชฏเชพเชฎเชพเช‚ เชฌเชฟเชŸเซเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡.

เชšเชพเชฒเซ‹ เช•เชนเซ€เช เช•เซ‡ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชŸเซ‡เช•เซเชธเซเชŸ เช›เซ‡. เชเช• เช…เช•เซเชทเชฐเชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เชœเช—เซเชฏเชพเชจเซ€ เชฎเชพเชคเซเชฐเชพเชจเซ‡ เช†เชชเชฃเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช˜เชŸเชพเชกเซ€ เชถเช•เซ€เช?

เชฎเซเช–เซเชฏ เชตเชฟเชšเชพเชฐ เชšเชฒ เชฒเช‚เชฌเชพเชˆ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช›เซ‡. เช…เชฎเซ‡ เช เชนเช•เซ€เช•เชคเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ€เช เช›เซ€เช เช•เซ‡ เชŸเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เช•เซ‡เชŸเชฒเชพเช• เช…เช•เซเชทเชฐเซ‹ เช…เชจเซเชฏ เช•เชฐเชคเชพ เชตเชงเซ เชตเช–เชค เช†เชตเซ‡ เช›เซ‡ (เช…เชนเซ€เช‚ เชœเซเช“) เชเช• เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชตเชฟเช•เชธเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‡ เชœเซ‡ เช“เช›เชพ เชฌเชฟเชŸเซเชธเชฎเชพเช‚ เช…เช•เซเชทเชฐเซ‹เชจเชพ เชธเชฎเชพเชจ เช•เซเชฐเชฎเชจเซ‡ เชฐเชœเซ‚ เช•เชฐเชถเซ‡. เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒ เชฒเซ‡เชจเซเชฅ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เชฎเชพเช‚, เช…เชฎเซ‡ เช…เช•เซเชทเชฐเซ‹เชจเซ‡ เช†เชชเซ‡เชฒ เชŸเซ‡เช•เซเชธเซเชŸเชฎเชพเช‚ เช•เซ‡เชŸเชฒเซ€ เชตเชพเชฐ เชฆเซ‡เช–เชพเชฏ เช›เซ‡ เชคเซ‡เชจเชพ เช†เชงเชพเชฐเซ‡ เชฌเชฟเชŸเซเชธเชจเซ€ เชšเชฒ เชธเช‚เช–เซเชฏเชพ เช…เชธเชพเช‡เชจ เช•เชฐเซ€เช เช›เซ€เช. เช›เซ‡เชตเชŸเซ‡, เช•เซ‡เชŸเชฒเชพเช• เช…เช•เซเชทเชฐเซ‹ 1 เชฌเซ€เชŸ เชœเซ‡เชŸเชฒเซ‹ เช“เช›เซ‹ เชธเชฎเชฏ เชฒเชˆ เชถเช•เซ‡ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เช…เชจเซเชฏ 2 เชฌเชฟเชŸเซเชธ, 3 เช…เชฅเชตเชพ เชตเชงเซ เชฒเชˆ เชถเช•เซ‡ เช›เซ‡. เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒ เชฒเซ‡เชจเซเชฅ เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เชจเซ€ เชธเชฎเชธเซเชฏเชพ เช เช•เซเชฐเชฎเชจเชพ เช…เชจเซเช—เชพเชฎเซ€ เชกเซ€เช•เซ‹เชกเชฟเช‚เช— เช›เซ‡.

เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡, เชฌเชฟเชŸเซเชธเชจเซ‹ เช•เซเชฐเชฎ เชœเชพเชฃเซ€เชจเซ‡, เชคเซ‡เชจเซ‡ เช…เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเชตเซเช‚?

เชฒเซ€เชŸเซ€ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹ "เช…เชฌเช•เชกเชพเชฌ". เชคเซ‡เชฎเชพเช‚ 8 เช…เช•เซเชทเชฐเซ‹ เช›เซ‡, เช…เชจเซ‡ เชœเซเชฏเชพเชฐเซ‡ เชจเชฟเชถเซเชšเชฟเชค เชฒเช‚เชฌเชพเชˆเชจเซ‡ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ 64 เชฌเชฟเชŸเซเชธเชจเซ€ เชœเชฐเซ‚เชฐ เชชเชกเชถเซ‡. เชจเซ‹เช‚เชง เช•เชฐเซ‹ เช•เซ‡ เชชเซเชฐเชคเซ€เช• เช†เชตเชฐเซเชคเชจ "a", "b", "c" ะธ "เชกเซ€" เช…เชจเซเช•เซเชฐเชฎเซ‡ 4, 2, 1, 1 เชฌเชฐเชพเชฌเชฐ. เชšเชพเชฒเซ‹ เช•เชฒเซเชชเชจเชพ เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเซ€เช "เช…เชฌเช•เชกเชพเชฌ" เช“เช›เชพ เชฌเชฟเชŸเซเชธ, เช เชนเช•เซ€เช•เชคเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ "เชชเซเชฐเชคเชฟ" เช•เชฐเชคเชพเช‚ เชตเชงเซ เชตเชพเชฐเช‚เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡ "เชฌเซ€"เช…เชจเซ‡ "เชฌเซ€" เช•เชฐเชคเชพเช‚ เชตเชงเซ เชตเชพเชฐเช‚เชตเชพเชฐ เชฅเชพเชฏ เช›เซ‡ "c" ะธ "เชกเซ€". เชšเชพเชฒเซ‹ เช•เซ‹เชกเชฟเช‚เช— เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เช•เชฐเซ€เช "เชชเซเชฐเชคเชฟ" 0 เชจเซ€ เชฌเชฐเชพเชฌเชฐ เชเช• เชฌเซ€เชŸ เชธเชพเชฅเซ‡, "เชฌเซ€" เช…เชฎเซ‡ เชฌเซ‡-เชฌเซ€เชŸ เช•เซ‹เชก 11 เชธเซ‹เช‚เชชเซ€เชถเซเช‚, เช…เชจเซ‡ เชคเซเชฐเชฃ เชฌเชฟเชŸเซเชธ 100 เช…เชจเซ‡ 011 เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช…เชฎเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเซ€เชถเซเช‚ "c" ะธ "เชกเซ€".

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเชจเซ‡ เชฎเชณเชถเซ‡:

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 เช…เชฎเซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช…เชธเซเชชเชทเซเชŸเชชเชฃเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเซ€ เชถเช•เซ€เชถเซเช‚ เช…เชจเซ‡ เช…เชฎเชพเชฐเซ€ เชฎเซ‚เชณ เชธเซเชŸเซเชฐเชฟเช‚เช— เชชเชฐ เชชเชพเช›เชพ เช†เชตเซ€เชถเซเช‚ "เช…เชฌเช•เชกเชพเชฌ".

เชนเชซเชฎเซ‡เชจ เช•เซ‹เชกเชฟเช‚เช—

เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชตเซ‡เชฐเชฟเชฏเซ‡เชฌเชฒ เชฒเซ‡เชจเซเชฅ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช…เชจเซ‡ เช‰เชชเชธเชฐเซเช— เชจเชฟเชฏเชฎ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซเชฏเซเช‚ เช›เซ‡, เชšเชพเชฒเซ‹ เชนเชซเชฎเซ‡เชจ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เช.

เชชเชฆเซเชงเชคเชฟ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชตเซƒเช•เซเชทเซ‹เชจเซ€ เชฐเชšเชจเชพ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡. เชคเซ‡เชฎเชพเช‚, เชจเซ‹เชก เช•เซเชฏเชพเช‚ เชคเซ‹ เช…เช‚เชคเชฟเชฎ เช…เชฅเชตเชพ เช†เช‚เชคเชฐเชฟเช• เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชถเชฐเซ‚เช†เชคเชฎเชพเช‚, เชคเชฎเชพเชฎ เช—เชพเช‚เช เซ‹เชจเซ‡ เชชเชพเช‚เชฆเชกเชพ (เชŸเชฐเซเชฎเชฟเชจเชฒ) เช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชชเซเชฐเชคเซ€เช• เชชเซ‹เชคเซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชตเชœเชจ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡, เช˜เชŸเชจเชพเชจเซ€ เช†เชตเชฐเซเชคเชจ) เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡. เช†เช‚เชคเชฐเชฟเช• เช—เชพเช‚เช เซ‹เชฎเชพเช‚ เชชเชพเชคเซเชฐเชจเซเช‚ เชตเชœเชจ เชนเซ‹เชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡ เชฌเซ‡ เชตเช‚เชถเชœ เช—เชพเช‚เช เซ‹เชจเซ‹ เชธเช‚เชฆเชฐเซเชญ เช†เชชเซ‡ เช›เซ‡. เชธเชพเชฎเชพเชจเซเชฏ เช•เชฐเชพเชฐ เชฆเซเชตเชพเชฐเชพ, เชฌเซ€เชŸ "0" เชกเชพเชฌเซ€ เชถเชพเช–เชพเชจเซ‡ เช…เชจเซเชธเชฐเซ€เชจเซ‡ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ "1" - เชœเชฎเชฃเซ€ เชฌเชพเชœเซเช. เชธเช‚เชชเซ‚เชฐเซเชฃ เชตเซƒเช•เซเชทเชฎเชพเช‚ N เชชเชพเช‚เชฆเชกเชพ เช…เชจเซ‡ N-1 เช†เช‚เชคเชฐเชฟเช• เช—เชพเช‚เช เซ‹. เชเชตเซ€ เชญเชฒเชพเชฎเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เชนเชซเชฎเซ‡เชจ เชŸเซเชฐเซ€ เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡, เชถเซเชฐเซ‡เชทเซเช  เชฒเช‚เชฌเชพเชˆเชจเชพ เช•เซ‹เชกเซเชธ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชจเช‰เชชเชฏเซ‹เช—เซ€ เชชเซเชฐเชคเซ€เช•เซ‹เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡.

เชนเชซเชฎเซ‡เชจ เชŸเซเชฐเซ€ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช…เชฎเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏเชคเชพ เช•เชคเชพเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชถเซเช‚, เชœเซเชฏเชพเช‚ เชธเซŒเชฅเซ€ เช“เช›เซ€ เช†เชตเชฐเซเชคเชจ เชงเชฐเชพเชตเชคเชพ เชจเซ‹เชกเชจเซ‡ เชธเซŒเชฅเซ€ เชตเชงเซ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เชฌเชพเช‚เชงเช•เชพเชฎเชจเชพ เชชเช—เชฒเชพเช‚ เชจเซ€เชšเซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เช›เซ‡:

  1. เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐ เชฎเชพเชŸเซ‡ เชฒเซ€เชซ เชจเซ‹เชก เชฌเชจเชพเชตเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชชเซเชฐเชพเชฅเชฎเชฟเช•เชคเชพ เช•เชคเชพเชฐเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเซ‹.
  2. เชœเซเชฏเชพเชฐเซ‡ เช•เชคเชพเชฐเชฎเชพเช‚ เชเช• เช•เชฐเชคเชพเช‚ เชตเชงเซ เชถเซ€เชŸ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช•เชฐเซ‹:
    • เช•เชคเชพเชฐเชฎเชพเช‚เชฅเซ€ เชธเชฐเซเชตเซ‹เชšเซเชš เช…เช—เซเชฐเชคเชพ (เชธเซŒเชฅเซ€ เช“เช›เซ€ เช†เชตเชฐเซเชคเชจ) เชธเชพเชฅเซ‡ เชฌเซ‡ เช—เชพเช‚เช เซ‹ เชฆเซ‚เชฐ เช•เชฐเซ‹;
    • เชเช• เชจเชตเซ‹ เช†เช‚เชคเชฐเชฟเช• เชจเซ‹เชก เชฌเชจเชพเชตเซ‹, เชœเซเชฏเชพเช‚ เช† เชฌเซ‡ เช—เชพเช‚เช เซ‹ เชฌเชพเชณเช•เซ‹ เชนเชถเซ‡, เช…เชจเซ‡ เช˜เชŸเชจเชพเชจเซ€ เช†เชตเชฐเซเชคเชจ เช† เชฌเซ‡ เช—เชพเช‚เช เซ‹เชจเซ€ เชซเซเชฐเซ€เช•เซเชตเชจเซเชธเซ€เชจเชพ เชธเชฐเชตเชพเชณเชพ เชœเซ‡เชŸเชฒเซ€ เชนเชถเซ‡.
    • เชชเซเชฐเชพเชงเชพเชจเซเชฏเชคเชพ เช•เชคเชพเชฐเชฎเชพเช‚ เชเช• เชจเชตเซ‹ เชจเซ‹เชก เช‰เชฎเซ‡เชฐเซ‹.
  3. เชเช•เชฎเชพเชคเซเชฐ เชฌเชพเช•เซ€เชจเซ‹ เชจเซ‹เชก เชฐเซเชŸ เชนเชถเซ‡, เช…เชจเซ‡ เช† เชตเซƒเช•เซเชทเชจเซเช‚ เชฌเชพเช‚เชงเช•เชพเชฎ เชชเซ‚เชฐเซเชฃ เช•เชฐเชถเซ‡.

เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹ เช•เซ‡ เช†เชชเชฃเซ€ เชชเชพเชธเซ‡ เช…เชฎเซเช• เชฒเช–เชพเชฃ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชฎเชพเชคเซเชฐ เช…เช•เซเชทเชฐเซ‹เชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ "เช เชฌเซ€ เชธเซ€ เชกเซ€" ะธ "เช…เชจเซ‡", เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เช˜เชŸเชจเชพเชจเซ€ เช†เชตเชฐเซเชคเชจ เช…เชจเซเช•เซเชฐเชฎเซ‡ 15, 7, 6, 6 เช…เชจเซ‡ 5 เช›เซ‡. เชจเซ€เชšเซ‡ เชšเชฟเชคเซเชฐเซ‹ เช›เซ‡ เชœเซ‡ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเชพ เชชเช—เชฒเชพเช‚เชจเซ‡ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ

เชฐเซเชŸเชฅเซ€ เช•เซ‹เชˆเชชเชฃ เช…เช‚เชคเชฟเชฎ เชจเซ‹เชก เชธเซเชงเซ€เชจเซ‹ เชฎเชพเชฐเซเช— เชคเซ‡ เช…เช‚เชคเชฟเชฎ เชจเซ‹เชก เชธเชพเชฅเซ‡ เชธเช‚เช•เชณเชพเชฏเซ‡เชฒ เช…เช•เซเชทเชฐเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชถเซเชฐเซ‡เชทเซเช  เช‰เชชเชธเชฐเซเช— เช•เซ‹เชก (เชœเซ‡ เชนเชซเชฎเซ‡เชจ เช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชชเชฃ เช“เชณเช–เชพเชฏ เช›เซ‡) เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชถเซ‡.

เชนเชซเชฎเซ‡เชจ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ
เชนเชซเชฎเซ‡เชจ เชตเซƒเช•เซเชท

เชจเซ€เชšเซ‡ เชคเชฎเชจเซ‡ 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 เชฌเชฟเชŸเซเชธ เช›เซ‡ เชเชŸเชฒเซ‡ เช•เซ‡. เชกเซ‡เชŸเชพ เชฒเช—เชญเช— 48% เชฆเซเชตเชพเชฐเชพ เชธเช‚เช•เซเชšเชฟเชค เช›เซ‡. เช‰เชชเชฐเชจเชพ C++ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฎเชพเช‚, เช…เชฎเซ‡ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชจเซ‡ เชตเชพเช‚เชšเซ€ เชถเช•เชพเชฏ เชคเซ‡ เชฎเชพเชŸเซ‡ เชเชจเซเช•เซ‹เชกเซ‡เชก เชธเซเชŸเซเชฐเชฟเช‚เช— เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชŸเซเชฐเชฟเช‚เช— เช•เซเชฒเชพเชธเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช.

เช•เชพเชฐเชฃ เช•เซ‡ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชชเซเชฐเชพเชฏเซ‹เชฐเชฟเชŸเซ€ เช•เชคเชพเชฐ เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ‡ เชชเซเชฐเชคเชฟ เชจเชฟเชตเซ‡เชถเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ O(เชฒเซ‹เช—(N)) เชธเชฎเชฏ, เชชเชฐเช‚เชคเซ เชธเชพเชฅเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชตเซƒเช•เซเชทเชฎเชพเช‚ N เชชเชพเช‚เชฆเชกเชพ เชนเชพเชœเชฐ 2N-1 เชจเซ‹เชกเซเชธ, เช…เชจเซ‡ เชนเชซเชฎเซ‡เชจ เชŸเซเชฐเซ€ เช เชธเช‚เชชเซ‚เชฐเซเชฃ เชฌเชพเชˆเชจเชฐเซ€ เชŸเซเชฐเซ€ เช›เซ‡, เชชเช›เซ€ เชเชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เช…เช‚เชฆเชฐ เชšเชพเชฒเซ‡ เช›เซ‡ 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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹