เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ

เจ‡เฉฐเจฆเจฐเจพเจœเจผ

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเจš เจฎเฉˆเจ‚ เจฎเจธเจผเจนเฉ‚เจฐ เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เจฐเจพเจ‚เจ—เจพ, เจจเจพเจฒ เจนเฉ€ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจตเจฟเจš เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจฌเจพเจฐเฉ‡ เจตเฉ€.

เจจเจคเฉ€เจœเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจ‡เฉฑเจ• เจธเจงเจพเจฐเจจ เจ†เจฐเจšเฉ€เจตเจฐ เจฒเจฟเจ–เจพเจ‚เจ—เฉ‡เฅค เจ‡เจธ เจฌเจพเจฐเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพ เจšเฉเฉฑเจ•เฉ€ เจนเฉˆ Habrรฉ 'เจคเฉ‡ เจฒเฉ‡เจ–, เจชเจฐ เจ…เจฎเจฒเฉ€ เจ…เจฎเจฒ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚เฅค เจฎเฉŒเจœเฉ‚เจฆเจพ เจชเฉ‹เจธเจŸ เจฆเฉ€ เจธเจฟเจงเจพเจ‚เจคเจ• เจธเจฎเฉฑเจ—เจฐเฉ€ เจธเจ•เฉ‚เจฒ เจฆเฉ‡ เจ•เฉฐเจชเจฟเจŠเจŸเจฐ เจตเจฟเจ—เจฟเจ†เจจ เจฆเฉ‡ เจชเจพเจ เจพเจ‚ เจ…เจคเฉ‡ เจฐเฉŒเจฌเจฐเจŸ เจฒเฉˆเจซเฉ‹เจฐเจŸ เจฆเฉ€ เจ•เจฟเจคเจพเจฌ "เจœเจพเจตเจพ เจตเจฟเฉฑเจš เจกเฉ‡เจŸเจพ เจธเจŸเฉเจฐเจ•เจšเจฐ เจ…เจคเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ" เจคเฉ‹เจ‚ เจฒเจˆ เจ—เจˆ เจนเฉˆเฅค เจ‡เจธ เจฒเจˆ, เจธเจญ เจ•เฉเจ เจ•เฉฑเจŸเจฟเจ† เจ—เจฟเจ† เจนเฉˆ!

เจ•เฉเจ เจตเจฟเจšเจพเจฐ

เจ‡เฉฑเจ• เจจเจฟเจฏเจฎเจค เจŸเฉˆเจ•เจธเจŸ เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจ…เฉฑเจ–เจฐ 8 เจฌเจฟเฉฑเจŸ (ASCII เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ—) เจœเจพเจ‚ 16 (เจฏเฉ‚เจจเฉ€เจ•เฉ‹เจก เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ—) เจจเจพเจฒ เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ…เฉฑเจ—เฉ‡ เจ…เจธเฉ€เจ‚ ASCII เจ‡เฉฐเจ•เฉ‹เจกเจฟเฉฐเจ— 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, s1 = โ€œเจธเฉ‚เจธเฉ€ เจ•เจนเจฟเฉฐเจฆเฉ€ เจนเฉˆ เจ•เจฟ เจ‡เจน เจ†เจธเจพเจจ เจนเฉˆโ€ เจฒเจพเจˆเจจ เจฒเจ“เฅค เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจ•เฉเฉฑเจฒ 22 เจ…เฉฑเจ–เจฐ เจนเจจ, เจ•เฉเจฆเจฐเจคเฉ€ เจคเฉŒเจฐ 'เจคเฉ‡, เจ–เจพเจฒเฉ€ เจฅเจพเจ‚เจตเจพเจ‚ เจ…เจคเฉ‡ เจจเจตเฉ€เจ‚ เจฒเจพเจˆเจจ เจ…เฉฑเจ–เจฐ - 'n' เจธเจฎเฉ‡เจคเฅค เจ‡เจธ เจฒเจพเจˆเจจ เจตเจพเจฒเฉ€ เจซเจพเจˆเจฒ เจฆเจพ เจตเจœเจผเจจ 22*8 = 176 เจฌเจฟเฉฑเจŸ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจธเจตเจพเจฒ เจคเฉเจฐเฉฐเจค เจ‰เฉฑเจ เจฆเจพ เจนเฉˆ: เจ•เฉ€ 8 เจ…เฉฑเจ–เจฐ เจจเฉ‚เฉฐ เจเจจเจ•เฉ‹เจก เจ•เจฐเจจ เจฒเจˆ เจธเจพเจฐเฉ‡ 1 เจฌเจฟเฉฑเจŸเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจคเจฐเจ•เจธเฉฐเจ—เจค เจนเฉˆ? เจ…เจธเฉ€เจ‚ เจธเจพเจฐเฉ‡ ASCII เจ…เฉฑเจ–เจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจญเจพเจตเฉ‡เจ‚ เจ‰เจน เจ…เจœเจฟเจนเจพ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจธเจญ เจคเฉ‹เจ‚ เจ†เจฎ เจ…เฉฑเจ–เจฐ - S - เจจเฉ‚เฉฐ เจธเจญ เจคเฉ‹เจ‚ เจ›เฉ‹เจŸเจพ เจ•เฉ‹เจก เจฆเจฟเฉฑเจคเจพ เจœเจพเจฃเจพ, เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจ…เฉฑเจ–เจฐ - T (เจœเจพเจ‚ U, เจœเจพเจ‚ 'n') - เจฒเจˆ เจ‡เฉฑเจ• เจฒเฉฐเจฌเจพ เจ•เฉ‹เจก เจฆเจฟเฉฑเจคเจพ เจœเจพเจฃเจพ เจตเจงเฉ‡เจฐเฉ‡ เจคเจฐเจ•เจธเฉฐเจ—เจค เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจน เจ‰เจน เจนเฉˆ เจœเฉ‹ เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจนเฉˆ: เจ…เจจเฉเจ•เฉ‚เจฒ เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจตเจฟเจ•เจฒเจช เจจเฉ‚เฉฐ เจฒเฉฑเจญเจฃเจพ เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจซเจพเจˆเจฒ เจฆเจพ เจ˜เฉฑเจŸเฉ‹ เจ˜เฉฑเจŸ เจญเจพเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ†เจฎ เจนเฉˆ เจ•เจฟ เจ•เฉ‹เจก เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจตเฉฑเจ–-เจตเฉฑเจ– เจšเจฟเฉฐเจจเฉเจนเจพเจ‚ เจฒเจˆ เจตเฉฑเจ–เจฐเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ - เจ‡เจน เจ‰เจน เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจ…เจงเจพเจฐเจค เจนเฉˆเฅค

เจ•เฉ‹เจกเจฟเฉฐเจ—

เจ•เจฟเจ‰เจ‚ เจจเจพ เจ…เฉฑเจ–เจฐ 'S' เจจเฉ‚เฉฐ เจ•เฉ‹เจก เจฆเจฟเจ“, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, 1 เจฌเจฟเฉฑเจŸ เจฒเฉฐเจฌเจพ: 0 เจœเจพเจ‚ 1เฅค เจ‡เจธเจจเฉ‚เฉฐ 1 เจนเฉ‹เจฃ เจฆเจฟเจ“เฅค เจซเจฟเจฐ เจฆเฉ‚เจœเจพ เจธเจญ เจคเฉ‹เจ‚ เจ†เจฎ เจ…เฉฑเจ–เจฐ - '' (เจธเจชเฉ‡เจธ) - 0 เจฆเจฟเจ“เฅค เจ•เจฒเจชเจจเจพ เจ•เจฐเฉ‹ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉ‹เจก เจ•เจฐเจจเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐ เจฆเจฟเฉฑเจคเจพ เจนเฉˆ - เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเฉ€ เจธเจคเจฐ s1 - เจ…เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เฉ‹เจก 1 เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจคเจพเจ‚, เจคเฉเจธเฉ€เจ‚ เจ•เฉ€ เจ•เจฐเจฆเฉ‡ เจนเฉ‹: เจ•เฉ€ เจ‡เจน เจ…เฉฑเจ–เจฐ S เจนเฉˆ, เจœเจพเจ‚ เจ•เฉ€ เจ‡เจน เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจ…เฉฑเจ–เจฐ เจนเฉˆ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ A? เจ‡เจธ เจฒเจˆ, เจ‡เฉฑเจ• เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจจเจฟเจฏเจฎ เจชเฉˆเจฆเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆ:

เจ•เฉ‹เจˆ เจตเฉ€ เจ•เฉ‹เจก เจฆเฉ‚เจœเฉ‡ เจฆเจพ เจ…เจ—เฉ‡เจคเจฐ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ

เจ‡เจน เจจเจฟเจฏเจฎ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจตเจฟเฉฑเจš เจ•เฉเฉฐเจœเฉ€ เจนเฉˆ. เจ‡เจธ เจฒเจˆ, เจ‡เฉฑเจ• เจ•เฉ‹เจก เจฌเจฃเจพเจ‰เจฃเจพ เจ‡เฉฑเจ• เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ เจธเจพเจฐเจฃเฉ€ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจนเจฐเฉ‡เจ• เจชเฉเจฐเจคเฉ€เจ• เจฆเฉ€ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ (เจฎเฉŒเจ•เฉ‡ เจฆเฉ€ เจธเฉฐเจ–เจฟเจ†) เจจเฉ‚เฉฐ เจฆเจฐเจธเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจง เจ˜เจŸเจจเจพเจตเจพเจ‚ เจตเจพเจฒเฉ‡ เจ…เฉฑเจ–เจฐ เจ˜เฉฑเจŸ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเฉ‡ เจœเจพเจฃเฉ‡ เจšเจพเจนเฉ€เจฆเฉ‡ เจนเจจ เจธเฉฐเจญเจต เจฌเจฟเฉฑเจŸ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€. เจฎเฉˆเจ‚ เจธเฉฐเจญเจพเจตเจฟเจค เจ•เฉ‹เจก เจŸเฉ‡เจฌเจฒเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจฆเฉ€ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจฆเฉ‡เจตเจพเจ‚เจ—เจพ:

เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจ‡เจธ เจฒเจˆ เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเจพ เจธเฉเจจเฉ‡เจนเจพ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ:

10 01111 10 110 1111 00 10 010 1110 10 00 110 0110 00 110 10 00 1111 010 10 1110 01110

เจฎเฉˆเจ‚ เจนเจฐเฉ‡เจ• เจ…เฉฑเจ–เจฐ เจฆเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจธเจชเฉ‡เจธ เจจเจพเจฒ เจตเฉฑเจ– เจ•เฉ€เจคเจพเฅค เจ‡เจน เจธเฉฑเจšเจฎเฉเฉฑเจš เจธเฉฐเจ•เฉเจšเจฟเจค เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพ!
เจธเจตเจพเจฒ เจ‰เฉฑเจ เจฆเจพ เจนเฉˆ: เจ‡เจน เจจเฉŒเจœเจตเจพเจจ เจ•เฉ‹เจก เจฆเฉ€ เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เฉ‹เจก เจจเจพเจฒ เจ•เจฟเจตเฉ‡เจ‚ เจ†เจ‡เจ†? เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจ‡เฉฑเจ• เจนเจซเจฎเฉˆเจจ เจฐเฉเฉฑเจ– เจฆเจพ เจจเจฟเจฐเจฎเจพเจฃ

เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจฌเจพเจˆเจจเจฐเฉ€ เจ–เฉ‹เจœ เจฐเฉเฉฑเจ– เจฌเจšเจพเจ… เจฒเจˆ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจ. เจšเจฟเฉฐเจคเจพ เจจเจพ เจ•เจฐเฉ‹, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจฅเฉ‡ เจ–เฉ‹เจœ, เจธเฉฐเจฎเจฟเจฒเจฟเจค เจ•เจฐเจจ เจœเจพเจ‚ เจฎเจฟเจŸเจพเจ‰เจฃ เจฆเฉ‡ เจคเจฐเฉ€เจ•เจฟเจ†เจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจชเจตเฉ‡เจ—เฉ€เฅค เจ‡เฉฑเจฅเฉ‡ เจœเจพเจตเจพ เจตเจฟเฉฑเจš เจฐเฉเฉฑเจ– เจฆเฉ€ เจฌเจฃเจคเจฐ เจนเฉˆ:

public class Node {
    private int frequence;
    private char letter;
    private Node leftChild;
    private Node rightChild;
    ...
}

class BinaryTree {
    private Node root;

    public BinaryTree() {
        root = new Node();
    }
    public BinaryTree(Node root) {
        this.root = root;
    }
    ...
}

เจ‡เจน เจชเฉ‚เจฐเจพ เจ•เฉ‹เจก เจจเจนเฉ€เจ‚ เจนเฉˆ, เจชเฉ‚เจฐเจพ เจ•เฉ‹เจก เจนเฉ‡เจ เจพเจ‚ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค

เจ‡เฉฑเจฅเฉ‡ เจฐเฉเฉฑเจ– เจจเฉ‚เฉฐ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจนเฉˆ:

  1. เจธเฉฐเจฆเฉ‡เจธเจผ (เจฒเจพเจˆเจจ s1) เจคเฉ‹เจ‚ เจนเจฐเฉ‡เจ• เจ…เฉฑเจ–เจฐ เจฒเจˆ เจ‡เฉฑเจ• เจจเฉ‹เจก เจ†เจฌเจœเฉˆเจ•เจŸ เจฌเจฃเจพเจ“เฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš 9 เจจเฉ‹เจก (เจจเฉ‹เจก เจ†เจฌเจœเฉˆเจ•เจŸ) เจนเฉ‹เจฃเจ—เฉ‡เฅค เจนเจฐเฉ‡เจ• เจจเฉ‹เจก เจตเจฟเฉฑเจš เจฆเฉ‹ เจกเฉ‡เจŸเจพ เจ–เฉ‡เจคเจฐ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ: เจชเฉเจฐเจคเฉ€เจ• เจ…เจคเฉ‡ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ
  2. เจนเจฐเฉ‡เจ• เจจเฉ‹เจก เจฒเจˆ เจ‡เฉฑเจ• เจŸเฉเจฐเฉ€ เจ†เจฌเจœเฉˆเจ•เจŸ (เจฌเจพเจˆเจจเจฐเฉ€ เจŸเฉเจฐเฉ€) เจฌเจฃเจพเจ“เฅค เจจเฉ‹เจก เจฐเฉเฉฑเจ– เจฆเฉ€ เจœเฉœเฉเจน เจฌเจฃ เจœเจพเจ‚เจฆเจพ เจนเฉˆ.
  3. เจ‡เจนเจจเจพเจ‚ เจฐเฉเฉฑเจ–เจพเจ‚ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจนเฉ€ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค เจซเฉเจฐเฉ€เจ•เฉเจเจ‚เจธเฉ€ เจœเจฟเฉฐเจจเฉ€ เจ˜เฉฑเจŸ เจนเฉ‹เจตเฉ‡เจ—เฉ€, เจคเจฐเจœเฉ€เจน เจ“เจจเฉ€ เจนเฉ€ เจœเจผเจฟเจ†เจฆเจพ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚, เจเจ•เจธเจŸเจฐเฉˆเจ•เจŸ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจธเจญ เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ เจตเจพเจฒเจพ เจกเฉ‡เจฐเจตเฉ‹ เจนเจฎเฉ‡เจธเจผเจพ เจšเฉเจฃเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ…เฉฑเจ—เฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจšเฉฑเจ•เจฐ เจ…เจจเฉเจธเจพเจฐ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ:

  1. เจคเจฐเจœเฉ€เจนเฉ€ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฆเฉ‹ เจฐเฉเฉฑเจ–เจพเจ‚ เจจเฉ‚เฉฐ เจนเจŸเจพเจ“ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจจเจตเฉ‡เจ‚ เจจเฉ‹เจก (เจ…เฉฑเจ–เจฐ เจคเฉ‹เจ‚ เจฌเจฟเจจเจพเจ‚ เจจเจตเจพเจ‚ เจฌเจฃเจพเจ‡เจ† เจจเฉ‹เจก) เจฆเฉ‡ เจฌเฉฑเจšเฉ‡ เจฌเจฃเจพเจ“เฅค เจจเจตเฉ‡เจ‚ เจจเฉ‹เจก เจฆเฉ€ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ เจฆเฉ‹ เจ‰เฉฑเจคเจฐเจพเจงเจฟเจ•เจพเจฐเฉ€ เจฐเฉเฉฑเจ–เจพเจ‚ เจฆเฉ€ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ เจฆเฉ‡ เจœเฉ‹เฉœ เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆเฅค
  2. เจ‡เจธ เจจเฉ‹เจก เจฒเจˆ, เจ‡เจธ เจจเฉ‹เจก 'เจคเฉ‡ เจฐเฉ‚เจŸ เจจเจพเจฒ เจ‡เฉฑเจ• เจฐเฉเฉฑเจ– เจฌเจฃเจพเจ“เฅค เจ‡เจธ เจฐเฉเฉฑเจ– เจจเฉ‚เฉฐ เจตเจพเจชเจธ เจคเจฐเจœเฉ€เจนเฉ€ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจธเจผเจพเจฎเจฒ เจ•เจฐเฉ‹เฅค (เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฐเฉเฉฑเจ– เจฆเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจฌเจพเจฐเฉฐเจฌเจพเจฐเจคเจพ เจนเฉˆ, เจ‡เจน เจธเฉฐเจญเจพเจตเจค เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจœเจ—เฉเจนเจพ เจตเจฟเฉฑเจš เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจตเฉ‡เจ—เจพ)
  3. เจ•เจฆเจฎ 1 เจ…เจคเฉ‡ 2 เจจเฉ‚เฉฐ เจœเจพเจฐเฉ€ เจฐเฉฑเจ–เฉ‹ เจœเจฆเฉ‹เจ‚ เจคเฉฑเจ• เจ•เจคเจพเจฐ เจตเจฟเฉฑเจš เจธเจฟเจฐเจซเจผ เจ‡เฉฑเจ• เจฐเฉเฉฑเจ– เจฌเจšเจฟเจ† เจจเจนเฉ€เจ‚ เจนเฉˆ - เจนเจซเจฎเฉˆเจจ เจฐเฉเฉฑเจ–

เจฒเจพเจˆเจจ s1 'เจคเฉ‡ เจ‡เจธ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเฉ‹:

เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ

เจ‡เฉฑเจฅเฉ‡ เจšเจฟเฉฐเจจเฉเจน โ€œlfโ€ (เจฒเจพเจˆเจจเจซเฉ€เจก) เจฆเจพ เจ…เจฐเจฅ เจนเฉˆ เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจฒเจพเจˆเจจ, โ€œspโ€ (เจธเจชเฉ‡เจธ) เจ‡เฉฑเจ• เจธเจชเฉ‡เจธ เจนเฉˆเฅค

เจ…เจคเฉ‡ เจ…เฉฑเจ—เฉ‡ เจ•เฉ€ เจนเฉˆ?

เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจนเจซเจฎเฉˆเจจ เจฆเจพ เจฐเฉเฉฑเจ– เจฎเจฟเจฒเจฟเจ†เฅค เจ เฉ€เจ• เจนเฉˆ. เจ…เจคเฉ‡ เจ‡เจธ เจจเจพเจฒ เจ•เฉ€ เจ•เจฐเจจเจพ เจนเฉˆ? เจ‰เจน เจ‡เจธเจจเฉ‚เฉฐ เจฎเฉเจซเจค เจตเจฟเฉฑเจš เจตเฉ€ เจจเจนเฉ€เจ‚ เจฒเฉˆเจฃเจ—เฉ‡เฅค เจ…เจคเฉ‡ เจซเจฟเจฐ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจœเฉœเฉเจน เจคเฉ‹เจ‚ เจฒเฉˆ เจ•เฉ‡ เจฆเจฐเจ–เจค เจฆเฉ‡ เจชเฉฑเจคเจฟเจ†เจ‚ เจคเฉฑเจ• เจธเจพเจฐเฉ‡ เจธเฉฐเจญเจต เจฐเจธเจคเฉ‡ เจฒเฉฑเจญเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆเฅค เจšเจฒเฉ‹ เจ‡เฉฑเจ• เจ•เจฟเจจเจพเจฐเฉ‡ เจจเฉ‚เฉฐ 0 เจฆเจฐเจธเจพเจ‰เจฃ เจฒเจˆ เจธเจนเจฟเจฎเจค เจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ เจœเฉ‡เจ•เจฐ เจ‡เจน เจ–เฉฑเจฌเฉ‡ เจฌเฉฑเจšเฉ‡ เจตเฉฑเจฒ เจฒเฉˆ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ 1 เจœเฉ‡เจ•เจฐ เจ‡เจน เจธเฉฑเจœเฉ‡ เจชเจพเจธเฉ‡ เจตเฉฑเจฒ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจธเจ–เจคเฉ€ เจจเจพเจฒ เจฌเฉ‹เจฒเจฆเฉ‡ เจนเฉ‹เจ, เจ‡เจธ เจธเฉฐเจ•เฉ‡เจค เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจชเฉเจฐเจคเฉ€เจ• เจฆเจพ เจ•เฉ‹เจก เจฆเจฐเจ–เจค เจฆเฉ€ เจœเฉœเฉเจน เจคเฉ‹เจ‚ เจชเฉฑเจคเฉ‡ เจคเฉฑเจ• เจฆเจพ เจฐเจธเจคเจพ เจนเฉˆ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เจน เจฌเจนเฉเจค เจนเฉ€ เจชเฉเจฐเจคเฉ€เจ• เจนเฉˆเฅค

เจนเจซเจฎเฉˆเจจ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจกเจพเจŸเจพ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ

เจ•เฉ‹เจกเจพเจ‚ เจฆเฉ€ เจธเจพเจฐเจฃเฉ€ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจจเจฟเจ•เจฒเฉ€เฅค เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจœเฉ‡ เจ…เจธเฉ€เจ‚ เจ‡เจธ เจธเจพเจฐเจฃเฉ€ 'เจคเฉ‡ เจตเจฟเจšเจพเจฐ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจคเจพเจ‚ เจ…เจธเฉ€เจ‚ เจนเจฐเฉ‡เจ• เจšเจฟเฉฐเจจเฉเจน เจฆเฉ‡ "เจญเจพเจฐ" เจฌเจพเจฐเฉ‡ เจธเจฟเฉฑเจŸเจพ เจ•เฉฑเจข เจธเจ•เจฆเฉ‡ เจนเจพเจ‚ - เจ‡เจน เจ‡เจธเจฆเฉ‡ เจ•เฉ‹เจก เจฆเฉ€ เจฒเฉฐเจฌเจพเจˆ เจนเฉˆ. เจซเจฟเจฐ, เจธเฉฐเจ•เฉเจšเจฟเจค เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ…เจธเจฒ เจซเจพเจˆเจฒ เจฆเจพ เจตเจœเจผเจจ เจนเฉ‹เจตเฉ‡เจ—เจพ: 2 * 3 + 2 * 4 + 3 * 3 + 6 * 2 + 1 * 4 + 1 * 5 + 2 * 4 + 4 * 2 + 1 * 5 = 65 เจฌเจฟเฉฑเจŸ . เจชเจนเจฟเจฒเจพเจ‚ เจ‡เจธ เจฆเจพ เจตเจœเจผเจจ 176 เจฌเจฟเฉฑเจŸ เจธเฉ€เฅค เจธเจฟเฉฑเจŸเฉ‡ เจตเจœเฉ‹เจ‚, เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ 176/65 = 2.7 เจ—เฉเจฃเจพ เจ˜เจŸเจพ เจฆเจฟเฉฑเจคเจพ! เจชเจฐ เจ‡เจน เจ‡เฉฑเจ• เจฏเฉ‚เจŸเฉ‹เจชเฉ€เจ† เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ—เฉเจฃเจพเจ‚เจ• เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจœเจพเจฃ เจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจ•เจฟเจ‰เจ‚? เจ‡เจธ เจฌเจพเจฐเฉ‡ เจฅเฉ‹เฉœเฉเจนเฉ‡ เจธเจฎเฉ‡เจ‚ เจฌเจพเจ…เจฆ เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจกเฉ€เจ•เฉ‹เจกเจฟเฉฐเจ—

เจ–เฉˆเจฐ, เจธเจผเจพเจ‡เจฆ เจธเจญ เจคเฉ‹เจ‚ เจธเจฐเจฒ เจšเฉ€เจœเจผ เจกเฉ€เจ•เฉ‹เจกเจฟเฉฐเจ— เจนเฉˆ. เจฎเฉˆเจจเฉ‚เฉฐ เจฒเจ—เจฆเจพ เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฌเจนเฉเจคเจฟเจ†เจ‚ เจจเฉ‡ เจ‡เจน เจ…เจจเฉเจฎเจพเจจ เจฒเจ—เจพเจ‡เจ† เจนเฉˆ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจธเฉฐเจ•เฉ‡เจค เจฆเฉ‡ เจ‡เฉฑเจ• เจธเฉฐเจ•เฉเจšเจฟเจค เจซเจพเจˆเจฒ เจจเจนเฉ€เจ‚ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€ - เจ…เจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉ€เจ•เฉ‹เจก เจ•เจฐเจจ เจฆเฉ‡ เจฏเฉ‹เจ— เจจเจนเฉ€เจ‚ เจนเฉ‹เจตเจพเจ‚เจ—เฉ‡! เจนเจพเจ‚, เจนเจพเจ‚, เจฎเฉ‡เจฐเฉ‡ เจฒเจˆ เจ‡เจน เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเจจเจพ เจ”เจ–เจพ เจธเฉ€, เจชเจฐ เจฎเฉˆเจจเฉ‚เฉฐ เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจŸเฉ‡เจฌเจฒ เจจเจพเจฒ เจ‡เฉฑเจ• เจŸเฉˆเจ•เจธเจŸ เจซเจพเจˆเจฒ table.txt เจฌเจฃเจพเจ‰เจฃเฉ€ เจชเจตเฉ‡เจ—เฉ€:

01110
 00
A010
E1111
I110
S10
T0110
U01111
Y1110

'เจชเฉเจฐเจคเฉ€เจ•' 'เจ…เฉฑเจ–เจฐ เจ•เฉ‹เจก' เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจธเจพเจฐเจฃเฉ€ เจเจ‚เจŸเจฐเฉ€เฅค 01110 เจฌเจฟเจจเจพเจ‚ เจšเจฟเฉฐเจจเฉเจน เจฆเฉ‡ เจ•เจฟเจ‰เจ‚ เจนเฉˆ? เจตเจพเจธเจคเจต เจตเจฟเฉฑเจš, เจ‡เจน เจ‡เฉฑเจ• เจชเฉเจฐเจคเฉ€เจ• เจฆเฉ‡ เจจเจพเจฒ เจนเฉˆ, เจ‡เจน เจธเจฟเจฐเจซ เจ‰เจน เจนเฉˆ เจœเฉ‹ เจœเจพเจตเจพ เจŸเฉ‚เจฒเจœเจผ เจœเฉ‹ เจฎเฉˆเจ‚ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ•เจฐเจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจตเจฐเจคเจฆเจพ เจนเจพเจ‚, เจจเจฟเจŠเจฒเจพเจˆเจจ เจ…เฉฑเจ–เจฐ - 'n' - เจ‡เฉฑเจ• เจจเจตเฉ€เจ‚ เจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ (เจญเจพเจตเฉ‡เจ‚ เจ‡เจน เจ•เจฟเฉฐเจจเฉ€ เจฌเฉ‡เจตเจ•เฉ‚เจซเฉ€ เจตเจพเจฒเฉ€ เจ†เจตเจพเจœเจผ เจนเฉ‹เจตเฉ‡)เฅค เจ‡เจธ เจฒเจˆ, เจธเจฟเจ–เจฐ 'เจคเฉ‡ เจ–เจพเจฒเฉ€ เจฒเจพเจˆเจจ เจ•เฉ‹เจก 01110 เจฒเจˆ เจ…เฉฑเจ–เจฐ เจนเฉˆเฅค เจ•เฉ‹เจก 00 เจฒเจˆ, เจ…เฉฑเจ–เจฐ เจฒเจพเจˆเจจ เจฆเฉ‡ เจธเจผเฉเจฐเฉ‚ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจชเฉ‡เจธ เจนเฉˆเฅค เจฎเฉˆเจ‚ เจคเฉเจฐเฉฐเจค เจ•เจนเจพเจ‚เจ—เจพ เจ•เจฟ เจธเจพเจกเฉ‡ เจ–เจพเจจ เจ—เฉเจฃเจพเจ‚เจ• เจฒเจˆ, เจ‡เฉฑเจ• เจธเจพเจฐเจฃเฉ€ เจจเฉ‚เฉฐ เจธเจŸเฉ‹เจฐ เจ•เจฐเจจ เจฆเจพ เจ‡เจน เจคเจฐเฉ€เจ•เจพ เจธเจญ เจคเฉ‹เจ‚ เจคเจฐเจ•เจนเฉ€เจฃ เจนเฉ‹เจฃ เจฆเจพ เจฆเจพเจ…เจตเจพ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจชเจฐ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฎเจเจฃเจพ เจ…เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจ†เจธเจพเจจ เจนเฉˆเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจธเฉฐเจฌเฉฐเจงเฉ€ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ€เจ†เจ‚ เจธเจฟเจซเจผเจพเจฐเจธเจผเจพเจ‚ เจธเฉเจฃ เจ•เฉ‡ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค

เจ‡เจน เจŸเฉ‡เจฌเจฒ เจนเฉ‹เจฃ เจจเจพเจฒ เจ‡เจธเจจเฉ‚เฉฐ เจกเฉ€เจ•เฉ‹เจก เจ•เจฐเจจเจพ เจฌเจนเฉเจค เจ†เจธเจพเจจ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ†เจ“ เจฏเจพเจฆ เจฐเฉฑเจ–เฉ€เจ เจ•เจฟ เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ เจ…เจธเฉ€เจ‚ เจ•เจฟเจนเฉœเฉ‡ เจจเจฟเจฏเจฎ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เฉ€เจคเฉ€ เจธเฉ€:

เจ•เฉ‹เจˆ เจตเฉ€ เจ•เฉ‹เจก เจฆเฉ‚เจœเฉ‡ เจฆเจพ เจ…เจ—เฉ‡เจคเจฐ เจจเจนเฉ€เจ‚ เจนเฉ‹เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ

เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ‡เจน เจ‡เฉฑเจ• เจธเฉเจตเจฟเจงเจพเจœเจจเจ• เจญเฉ‚เจฎเจฟเจ•เจพ เจจเจฟเจญเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ. เจ…เจธเฉ€เจ‚ เจ•เฉเจฐเจฎเจตเจพเจฐ เจฌเจฟเฉฑเจŸ-เจฌเจฟเฉฑเจŸ เจชเฉœเฉเจนเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡, เจœเจฟเจตเฉ‡เจ‚ เจนเฉ€ เจจเจคเฉ€เจœเฉ‡ เจตเจพเจฒเฉ€ เจธเจคเจฐ d, เจœเจฟเจธ เจตเจฟเฉฑเจš เจฐเฉ€เจก เจฌเจฟเฉฑเจŸ เจธเจผเจพเจฎเจฒ เจนเฉเฉฐเจฆเฉ‡ เจนเจจ, เจ…เฉฑเจ–เจฐ เจ…เฉฑเจ–เจฐ เจจเจพเจฒ เจธเฉฐเจฌเฉฐเจงเจฟเจค เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉˆ, เจธเจพเจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจชเจคเจพ เจฒเฉฑเจ— เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจ…เฉฑเจ–เจฐ เจ…เฉฑเจ–เจฐ (เจ…เจคเฉ‡ เจ•เฉ‡เจตเจฒ เจ‡เจน!) เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจธเฉ€เฅค เจ…เฉฑเจ—เฉ‡, เจ…เจธเฉ€เจ‚ เจกเฉ€เจ•เฉ‹เจกเจฟเฉฐเจ— เจฒเจพเจˆเจจ (เจกเฉ€เจ•เฉ‹เจก เจ•เฉ€เจคเฉ‡ เจธเฉฐเจฆเฉ‡เจธเจผ เจตเจพเจฒเฉ€ เจฒเจพเจˆเจจ) เจตเจฟเฉฑเจš เจ…เฉฑเจ–เจฐ เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚, เจฒเจพเจˆเจจ เจกเฉ€ เจจเฉ‚เฉฐ เจฐเฉ€เจธเฉˆเจŸ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚, เจ…เจคเฉ‡ เจซเจฟเจฐ เจเจจเจ•เฉ‹เจก เจ•เฉ€เจคเฉ€ เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจฆเฉ‡ เจนเจพเจ‚เฅค

ะ ะตะฐะปะธะทะฐั†ะธั

เจ‡เจน เจฎเฉ‡เจฐเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ เจ…เจชเจฎเจพเจจเจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจชเฉเจฐเจพเจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเจพ เจธเจฎเจพเจ‚ เจนเฉˆ. เจšเจฒเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ•เฉฐเจชเฉเจฐเฉˆเจธเจฐ เจ•เจนเจฟเฉฐเจฆเฉ‡ เจนเจพเจ‚เฅค

เจฆเฉเจฌเจพเจฐเจพ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ‹. เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ…เจธเฉ€เจ‚ เจจเฉ‹เจก เจ•เจฒเจพเจธ เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚:

public class Node {
    private int frequence;//ั‡ะฐัั‚ะพั‚ะฐ
    private char letter;//ะฑัƒะบะฒะฐ
    private Node leftChild;//ะปะตะฒั‹ะน ะฟะพั‚ะพะผะพะบ
    private Node rightChild;//ะฟั€ะฐะฒั‹ะน ะฟะพั‚ะพะผะพะบ

   

    public Node(char letter, int frequence) { //ัะพะฑัั‚ะฒะตะฝะฝะพ, ะบะพะฝัั‚ั€ัƒะบั‚ะพั€
        this.letter = letter;
        this.frequence = frequence;
    }

    public Node() {}//ะฟะตั€ะตะณั€ัƒะทะบะฐ ะบะพะฝัั‚ั€ัƒั‚ะพั€ะฐ ะดะปั ะฑะตะทั‹ะผัะฝะฝั‹ั… ัƒะทะปะพะฒ(ัะผ. ะฒั‹ัˆะต ะฒ ั€ะฐะทะดะตะปะต ะพ ะฟะพัั‚ั€ะพะตะฝะธะธ ะดะตั€ะตะฒะฐ ะฅะฐั„ั„ะผะฐะฝะฐ)
    public void addChild(Node newNode) {//ะดะพะฑะฐะฒะธั‚ัŒ ะฟะพั‚ะพะผะบะฐ
        if (leftChild == null)//ะตัะปะธ ะปะตะฒั‹ะน ะฟัƒัั‚ะพะน=> ะฟั€ะฐะฒั‹ะน ั‚ะพะถะต=> ะดะพะฑะฐะฒะปัะตะผ ะฒ ะปะตะฒั‹ะน
            leftChild = newNode;
        else {
            if (leftChild.getFrequence() <= newNode.getFrequence()) //ะฒ ะพะฑั‰ะตะผ, ะปะตะฒั‹ะผ ะฟะพั‚ะพะผะบะพะผ
                rightChild = newNode;//ัั‚ะฐะฝะตั‚ ั‚ะพั‚, ัƒ ะบะพะณะพ ะผะตะฝัŒัˆะต ั‡ะฐัั‚ะพั‚ะฐ
            else {
                rightChild = leftChild;
                leftChild = newNode;
            }
        }

        frequence += newNode.getFrequence();//ะธั‚ะพะณะพะฒะฐั ั‡ะฐัั‚ะพั‚ะฐ
    }

    public Node getLeftChild() {
        return leftChild;
    }

    public Node getRightChild() {
        return rightChild;
    }

    public int getFrequence() {
        return frequence;
    }

    public char getLetter() {
        return letter;
    }

    public boolean isLeaf() {//ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะปะธัั‚
        return leftChild == null && rightChild == null;
    }
}

เจนเฉเจฃ เจฐเฉเฉฑเจ–:

class BinaryTree {
    private Node root;

    public BinaryTree() {
        root = new Node();
    }

    public BinaryTree(Node root) {
        this.root = root;
    }

    public int getFrequence() {
        return root.getFrequence();
    }

    public Node getRoot() {
        return root;
    }
}

เจคเจฐเจœเฉ€เจน เจ•เจคเจพเจฐ:

import java.util.ArrayList;//ะดะฐ-ะดะฐ, ะพั‡ะตั€ะตะดัŒ ะฑัƒะดะตั‚ ะฝะฐ ะฑะฐะทะต ัะฟะธัะบะฐ

class PriorityQueue {
    private ArrayList<BinaryTree> data;//ัะฟะธัะพะบ ะพั‡ะตั€ะตะดะธ
    private int nElems;//ะบะพะป-ะฒะพ ัะปะตะผะตะฝั‚ะพะฒ ะฒ ะพั‡ะตั€ะตะดะธ

    public PriorityQueue() {
        data = new ArrayList<BinaryTree>();
        nElems = 0;
    }

    public void insert(BinaryTree newTree) {//ะฒัั‚ะฐะฒะบะฐ
        if (nElems == 0)
            data.add(newTree);
        else {
            for (int i = 0; i < nElems; i++) {
                if (data.get(i).getFrequence() > newTree.getFrequence()) {//ะตัะปะธ ั‡ะฐัั‚ะพั‚ะฐ ะฒัั‚ะฐะฒะปัะตะผะพะณะพ ะดะตั€ะตะฒะฐ ะผะตะฝัŒัˆะต 
                    data.add(i, newTree);//ั‡ะตะผ ั‡ะฐัั‚. ั‚ะตะบัƒั‰ะตะณะพ, ั‚ะพ cะดะฒะธะณะฐะตะผ ะฒัะต ะดะตั€ะตะฒัŒั ะฝะฐ ะฟะพะทะธั†ะธัั… ัะฟั€ะฐะฒะฐ ะฝะฐ 1 ัั‡ะตะนะบัƒ                   
                    break;//ะทะฐั‚ะตะผ ัั‚ะฐะฒะธะผ ะฝะพะฒะพะต ะดะตั€ะตะฒะพ ะฝะฐ ะฟะพะทะธั†ะธัŽ ั‚ะตะบัƒั‰ะตะณะพ
                }
                if (i == nElems - 1) 
                    data.add(newTree);
            }
        }
        nElems++;//ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ะบะพะป-ะฒะพ ัะปะตะผะตะฝั‚ะพะฒ ะฝะฐ 1
    }

    public BinaryTree remove() {//ัƒะดะฐะปะตะฝะธะต ะธะท ะพั‡ะตั€ะตะดะธ
        BinaryTree tmp = data.get(0);//ะบะพะฟะธั€ัƒะตะผ ัƒะดะฐะปัะตะผั‹ะน ัะปะตะผะตะฝั‚
        data.remove(0);//ัะพะฑัั‚ะฒะตะฝะฝะพ, ัƒะดะฐะปัะตะผ
        nElems--;//ัƒะผะตะฝัŒัˆะฐะตะผ ะบะพะป-ะฒะพ ัะปะตะผะตะฝั‚ะพะฒ ะฝะฐ 1
        return tmp;//ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ัƒะดะฐะปะตะฝะฝั‹ะน ัะปะตะผะตะฝั‚(ัะปะตะผะตะฝั‚ ั ะฝะฐะธะผะตะฝัŒัˆะตะน ั‡ะฐัั‚ะพั‚ะพะน)
    }
}

เจ•เจฒเจพเจธ เจœเฉ‹ เจนเจซเจฎเฉˆเจจ เจŸเฉเจฐเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ:

public class HuffmanTree {
    private final byte ENCODING_TABLE_SIZE = 127;//ะดะปะธะฝะฐ ะบะพะดะธั€ะพะฒะพั‡ะฝะพะน ั‚ะฐะฑะปะธั†ั‹
    private String myString;//ัะพะพะฑั‰ะตะฝะธะต
    private BinaryTree huffmanTree;//ะดะตั€ะตะฒะพ ะฅะฐั„ั„ะผะฐะฝะฐ
    private int[] freqArray;//ั‡ะฐัั‚ะพั‚ะฝะฐั ั‚ะฐะฑะปะธั†ะฐ
    private String[] encodingArray;//ะบะพะดะธั€ะพะฒะพั‡ะฝะฐั ั‚ะฐะฑะปะธั†ะฐ


    //----------------constructor----------------------
    public HuffmanTree(String newString) {
        myString = newString;

        freqArray = new int[ENCODING_TABLE_SIZE];
        fillFrequenceArray();

        huffmanTree = getHuffmanTree();

        encodingArray = new String[ENCODING_TABLE_SIZE];
        fillEncodingArray(huffmanTree.getRoot(), "", "");
    }

    //--------------------frequence array------------------------
    private void fillFrequenceArray() {
        for (int i = 0; i < myString.length(); i++) {
            freqArray[(int)myString.charAt(i)]++;
        }
    }

    public int[] getFrequenceArray() {
        return freqArray;
    }

    //------------------------huffman tree creation------------------
    private BinaryTree getHuffmanTree() {
        PriorityQueue pq = new PriorityQueue();
        //ะฐะปะณะพั€ะธั‚ะผ ะพะฟะธัะฐะฝ ะฒั‹ัˆะต
        for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
            if (freqArray[i] != 0) {//ะตัะปะธ ัะธะผะฒะพะป ััƒั‰ะตัั‚ะฒัƒะตั‚ ะฒ ัั‚ั€ะพะบะต
                Node newNode = new Node((char) i, freqArray[i]);//ั‚ะพ ัะพะทะดะฐั‚ัŒ ะดะปั ะฝะตะณะพ Node
                BinaryTree newTree = new BinaryTree(newNode);//ะฐ ะดะปั Node ัะพะทะดะฐั‚ัŒ BinaryTree
                pq.insert(newTree);//ะฒัั‚ะฐะฒะธั‚ัŒ ะฒ ะพั‡ะตั€ะตะดัŒ
            }
        }

        while (true) {
            BinaryTree tree1 = pq.remove();//ะธะทะฒะปะตั‡ัŒ ะธะท ะพั‡ะตั€ะตะดะธ ะฟะตั€ะฒะพะต ะดะตั€ะตะฒะพ.

            try {
                BinaryTree tree2 = pq.remove();//ะธะทะฒะปะตั‡ัŒ ะธะท ะพั‡ะตั€ะตะดะธ ะฒั‚ะพั€ะพะต ะดะตั€ะตะฒะพ

                Node newNode = new Node();//ัะพะทะดะฐั‚ัŒ ะฝะพะฒั‹ะน Node
                newNode.addChild(tree1.getRoot());//ัะดะตะปะฐั‚ัŒ ะตะณะพ ะฟะพั‚ะพะผะบะฐะผะธ ะดะฒะฐ ะธะทะฒะปะตั‡ะตะฝะฝั‹ั… ะดะตั€ะตะฒะฐ
                newNode.addChild(tree2.getRoot());

                pq.insert(new BinaryTree(newNode);
            } catch (IndexOutOfBoundsException e) {//ะพัั‚ะฐะปะพััŒ ะพะดะฝะพ ะดะตั€ะตะฒะพ ะฒ ะพั‡ะตั€ะตะดะธ
                return tree1;
            }
        }
    }

    public BinaryTree getTree() {
        return huffmanTree;
    }

    //-------------------encoding array------------------
    void fillEncodingArray(Node node, String codeBefore, String direction) {//ะทะฐะฟะพะปะฝะธั‚ัŒ ะบะพะดะธั€ะพะฒะพั‡ะฝัƒัŽ ั‚ะฐะฑะปะธั†ัƒ
        if (node.isLeaf()) {
            encodingArray[(int)node.getLetter()] = codeBefore + direction;
        } else {
            fillEncodingArray(node.getLeftChild(), codeBefore + direction, "0");
            fillEncodingArray(node.getRightChild(), codeBefore + direction, "1");
        }
    }

    String[] getEncodingArray() {
        return encodingArray;
    }

    public void displayEncodingArray() {//ะดะปั ะพั‚ะปะฐะดะบะธ
        fillEncodingArray(huffmanTree.getRoot(), "", "");

        System.out.println("======================Encoding table====================");
        for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
            if (freqArray[i] != 0) {
                System.out.print((char)i + " ");
                System.out.println(encodingArray[i]);
            }
        }
        System.out.println("========================================================");
    }
    //-----------------------------------------------------
    String getOriginalString() {
        return myString;
    }
}

เจ•เจฒเจพเจธ เจœเจฟเจธ เจตเจฟเฉฑเจš เจเจจเจ•เฉ‹เจก/เจกเฉ€เจ•เฉ‹เจก เจนเฉเฉฐเจฆเฉ‡ เจนเจจ:

public class HuffmanOperator {
    private final byte ENCODING_TABLE_SIZE = 127;//ะดะปะธะฝะฐ ั‚ะฐะฑะปะธั†ั‹
    private HuffmanTree mainHuffmanTree;//ะดะตั€ะตะฒะพ ะฅะฐั„ั„ะผะฐะฝะฐ (ะธัะฟะพะปัŒะทัƒะตั‚ัั ั‚ะพะปัŒะบะพ ะดะปั ัะถะฐั‚ะธั)
    private String myString;//ะธัั…ะพะดะฝะพะต ัะพะพะฑั‰ะตะฝะธะต
    private int[] freqArray;//ั‡ะฐัั‚ะพั‚ะฐะฝะฐั ั‚ะฐะฑะปะธั†ะฐ
    private String[] encodingArray;//ะบะพะดะธั€ะพะฒะพั‡ะฝะฐั ั‚ะฐะฑะปะธั†ะฐ
    private double ratio;//ะบะพัั„ั„ะธั†ะธะตะฝั‚ ัะถะฐั‚ะธั 


    public HuffmanOperator(HuffmanTree MainHuffmanTree) {//for compress
        this.mainHuffmanTree = MainHuffmanTree;

        myString = mainHuffmanTree.getOriginalString();

        encodingArray = mainHuffmanTree.getEncodingArray();

        freqArray = mainHuffmanTree.getFrequenceArray();
    }

    public HuffmanOperator() {}//for extract;

    //---------------------------------------compression-----------------------------------------------------------
    private String getCompressedString() {
        String compressed = "";
        String intermidiate = "";//ะฟั€ะพะผะตะถัƒั‚ะพั‡ะฝะฐั ัั‚ั€ะพะบะฐ(ะฑะตะท ะดะพะฑะฐะฒะพั‡ะฝั‹ั… ะฝัƒะปะตะน)
        //System.out.println("=============================Compression=======================");
        //displayEncodingArray();
        for (int i = 0; i < myString.length(); i++) {
            intermidiate += encodingArray[myString.charAt(i)];
        }
        //ะœั‹ ะฝะต ะผะพะถะตะผ ะฟะธัะฐั‚ัŒ ะฑะธั‚ ะฒ ั„ะฐะนะป. ะŸะพัั‚ะพะผัƒ ะฝัƒะถะฝะพ ัะดะตะปะฐั‚ัŒ ะดะปะธะฝัƒ ัะพะพะฑั‰ะตะฝะธั ะบั€ะฐั‚ะฝะพะน 8=>
        //ะฝัƒะถะฝะพ ะดะพะฑะฐะฒะธั‚ัŒ ะฝัƒะปะธ ะฒ ะบะพะฝะตั†(ะผะพะถะฝะพ 1, ะฝะตั‚ ั€ะฐะทะฝะธั†ั‹)
        byte counter = 0;//ะบะพะปะธั‡ะตัั‚ะฒะพ ะดะพะฑะฐะฒะปะตะฝะฝั‹ั… ะฒ ะบะพะฝะตั† ะฝัƒะปะตะน (ะฑะฐะนั‚ะฐ ะฒ ะฟะพะปะฝะต ั…ะฒะฐั‚ะธั‚: 0<=counter<8<127)
        for (int length = intermidiate.length(), delta = 8 - length % 8; 
        		counter < delta ; counter++) {//delta - ะบะพะปะธั‡ะตัั‚ะฒะพ ะดะพะฑะฐะฒะปะตะฝะฝั‹ั… ะฝัƒะปะตะน
            intermidiate += "0";
        }
        
        //ัะบะปะตะธั‚ัŒ ะบะพะป-ะฒะพ ะดะพะฑะฐะฒะพั‡ะฝั‹ั… ะฝัƒะปะตะน ะฒ ะฑะธะฝะฐั€ะฝะพะผ ะฟั€ะตะดะฐัั‚ะฒะปะตะฝะธะธ ะธ ะฟั€ะพะผะตะถัƒั‚ะพั‡ะฝัƒัŽ ัั‚ั€ะพะบัƒ 
        compressed = String.format("%8s", Integer.toBinaryString(counter & 0xff)).replace(" ", "0") + intermidiate;
        		
        //ะธะดะตะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ะน ะบะพัั„ั„ะธั†ะธะตะฝั‚
        setCompressionRatio();
        //System.out.println("===============================================================");
        return compressed;
    }
    
    private void setCompressionRatio() {//ะฟะพัั‡ะธั‚ะฐั‚ัŒ ะธะดะตะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ะน ะบะพัั„ั„ะธั†ะธะตะฝั‚ 
        double sumA = 0, sumB = 0;//A-the original sum
        for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
            if (freqArray[i] != 0) {
                sumA += 8 * freqArray[i];
                sumB += encodingArray[i].length() * freqArray[i];
            }
        }
        ratio = sumA / sumB;
    }

    public byte[] getBytedMsg() {//final compression
        StringBuilder compressedString = new StringBuilder(getCompressedString());
        byte[] compressedBytes = new byte[compressedString.length() / 8];
        for (int i = 0; i < compressedBytes.length; i++) {
                compressedBytes[i] = (byte) Integer.parseInt(compressedString.substring(i * 8, (i + 1) * 8), 2);
        }
        return compressedBytes;
    }
    //---------------------------------------end of compression----------------------------------------------------------------
    //------------------------------------------------------------extract-----------------------------------------------------
    public String extract(String compressed, String[] newEncodingArray) {
        String decompressed = "";
        String current = "";
        String delta = "";
        encodingArray = newEncodingArray;
        
        //displayEncodingArray();
        //ะฟะพะปัƒั‡ะธั‚ัŒ ะบะพะป-ะฒะพ ะฒัั‚ะฐะฒะปะตะฝะฝั‹ั… ะฝัƒะปะตะน
        for (int i = 0; i < 8; i++) 
        	delta += compressed.charAt(i);
        int ADDED_ZEROES = Integer.parseInt(delta, 2);
       
        for (int i = 8, l = compressed.length() - ADDED_ZEROES; i < l; i++) {
            //i = 8, ั‚.ะบ. ะฟะตั€ะฒั‹ะผ ะฑะฐะนั‚ะพะผ ัƒ ะฝะฐั ะธะดะตั‚ ะบะพะป-ะฒะพ ะฒัั‚ะฐะฒะปะตะฝะฝั‹ั… ะฝัƒะปะตะน
            current += compressed.charAt(i);
            for (int j = 0; j < ENCODING_TABLE_SIZE; j++) {
                if (current.equals(encodingArray[j])) {//ะตัะปะธ ัะพะฒะฟะฐะปะพ
                    decompressed += (char)j;//ั‚ะพ ะดะพะฑะฐะฒะปัะตะผ ัะปะตะผะตะฝั‚
                    current = "";//ะธ ะพะฑะฝัƒะปัะตะผ ั‚ะตะบัƒั‰ัƒัŽ ัั‚ั€ะพะบัƒ
                }
            }
        }

        return decompressed;
    }

    public String getEncodingTable() {
        String enc = "";
    	for (int i = 0; i < encodingArray.length; i++) {
        	if (freqArray[i] != 0) 
        		enc += (char)i + encodingArray[i] + 'n';
        }
    	return enc;
    }

    public double getCompressionRatio() {
        return ratio;
    }


    public void displayEncodingArray() {//ะดะปั ะพั‚ะปะฐะดะบะธ
        System.out.println("======================Encoding table====================");
        for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
            //if (freqArray[i] != 0) {
                System.out.print((char)i + " ");
                System.out.println(encodingArray[i]);
            //}
        }
        System.out.println("========================================================");
    }
    }

เจ‡เฉฑเจ• เจ•เจฒเจพเจธ เจœเฉ‹ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฃเจพ เจ†เจธเจพเจจ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ:

import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Closeable;

public class FileOutputHelper implements Closeable {
    private File outputFile;
    private FileOutputStream fileOutputStream;

    public FileOutputHelper(File file) throws FileNotFoundException {
        outputFile = file;
        fileOutputStream = new FileOutputStream(outputFile);
    }

    public void writeByte(byte msg) throws IOException {
        fileOutputStream.write(msg);
    }

    public void writeBytes(byte[] msg) throws IOException {
        fileOutputStream.write(msg);
    }

    public void writeString(String msg) {
    	try (PrintWriter pw = new PrintWriter(outputFile)) {
    		pw.write(msg);
    	} catch (FileNotFoundException e) {
    		System.out.println("ะะตะฒะตั€ะฝั‹ะน ะฟัƒั‚ัŒ, ะธะปะธ ั‚ะฐะบะพะณะพ ั„ะฐะนะปะฐ ะฝะต ััƒั‰ะตัั‚ะฒัƒะตั‚!");
    	}
    }

    @Override
    public void close() throws IOException {
        fileOutputStream.close();
    }

    public void finalize() throws IOException {
        close();
    }
}

เจ‡เฉฑเจ• เจ•เจฒเจพเจธ เจœเฉ‹ เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจชเฉœเฉเจนเจจเจพ เจ†เจธเจพเจจ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ€ เจนเฉˆ:

import java.io.FileInputStream;
import java.io.EOFException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;

public class FileInputHelper implements Closeable {
	private FileInputStream fileInputStream;
	private BufferedReader fileBufferedReader;
	
	public FileInputHelper(File file) throws IOException {
		fileInputStream = new FileInputStream(file);
		fileBufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
	}
	
	
    public byte readByte() throws IOException {
    	int cur = fileInputStream.read();
    	if (cur == -1)//ะตัะปะธ ะทะฐะบะพะฝั‡ะธะปัั ั„ะฐะนะป
    		throw new EOFException();
    	return (byte)cur;
    }
    
    public String readLine() throws IOException {
    	return fileBufferedReader.readLine();
    }
    
    @Override
    public void close() throws IOException{
    	fileInputStream.close();
    }
}

เจ–เฉˆเจฐ, เจ…เจคเฉ‡ เจฎเฉเฉฑเจ– เจ•เจฒเจพเจธ:

import java.io.File;
import java.nio.charset.MalformedInputException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.util.List;
import java.io.EOFException;
public class Main {
	private static final byte ENCODING_TABLE_SIZE = 127;
	
    public static void main(String[] args) throws IOException {
        try {//ัƒะบะฐะทั‹ะฒะฐะตะผ ะธะฝัั‚ั€ัƒะบั†ะธัŽ ั ะฟะพะผะพั‰ัŒัŽ ะฐั€ะณัƒะผะตะฝั‚ะพะฒ ะบะพะผะฐะฝะดะฝะพะน ัั‚ั€ะพะบะธ
            if (args[0].equals("--compress") || args[0].equals("-c"))
                compress(args[1]);
            else if ((args[0].equals("--extract") || args[0].equals("-x"))
            		&& (args[2].equals("--table") || args[2].equals("-t"))) {
            	extract(args[1], args[3]);
            }
            else
                throw new IllegalArgumentException();
        } catch (ArrayIndexOutOfBoundsException | IllegalArgumentException e) {
            System.out.println("ะะตะฒะตั€ะฝั‹ะน ั„ะพั€ะผะฐั‚ ะฒะฒะพะดะฐ ะฐั€ะณัƒะผะตะฝั‚ะพะฒ ");
            System.out.println("ะงะธั‚ะฐะนั‚ะต Readme.txt");
            e.printStackTrace();
        }
    }

	public static void compress(String stringPath) throws IOException {
        List<String> stringList;
        File inputFile = new File(stringPath);
        String s = "";
        File compressedFile, table;
        
        try {
            stringList = Files.readAllLines(Paths.get(inputFile.getAbsolutePath()));
        } catch (NoSuchFileException e) {
            System.out.println("ะะตะฒะตั€ะฝั‹ะน ะฟัƒั‚ัŒ, ะธะปะธ ั‚ะฐะบะพะณะพ ั„ะฐะนะปะฐ ะฝะต ััƒั‰ะตัั‚ะฒัƒะตั‚!");
            return;
        } catch (MalformedInputException e) {
        	System.out.println("ะขะตะบัƒั‰ะฐั ะบะพะดะธั€ะพะฒะบะฐ ั„ะฐะนะปะฐ ะฝะต ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั");
        	return;
        }

        for (String item : stringList) {
            s += item;
            s += 'n';
        }

        HuffmanOperator operator = new HuffmanOperator(new HuffmanTree(s));

        compressedFile = new File(inputFile.getAbsolutePath() + ".cpr");
        compressedFile.createNewFile();
        try (FileOutputHelper fo = new FileOutputHelper(compressedFile)) {
        	fo.writeBytes(operator.getBytedMsg());
        }
        //create file with encoding table:
        
        table = new File(inputFile.getAbsolutePath() + ".table.txt");
        table.createNewFile();
        try (FileOutputHelper fo = new FileOutputHelper(table)) {
        	fo.writeString(operator.getEncodingTable());
        }
        
        System.out.println("ะŸัƒั‚ัŒ ะบ ัะถะฐั‚ะพะผัƒ ั„ะฐะนะปัƒ: " + compressedFile.getAbsolutePath());
        System.out.println("ะŸัƒั‚ัŒ ะบ ะบะพะดะธั€ะพะฒะพั‡ะฝะพะน ั‚ะฐะฑะปะธั†ะต " + table.getAbsolutePath());
        System.out.println("ะ‘ะตะท ั‚ะฐะฑะปะธั†ั‹ ั„ะฐะนะป ะฑัƒะดะตั‚ ะฝะตะฒะพะทะผะพะถะฝะพ ะธะทะฒะปะตั‡ัŒ!");
        
        double idealRatio = Math.round(operator.getCompressionRatio() * 100) / (double) 100;//ะธะดะตะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ะน ะบะพัั„ั„ะธั†ะธะตะฝั‚
        double realRatio = Math.round((double) inputFile.length() 
        		/ ((double) compressedFile.length() + (double) table.length()) * 100) / (double)100;//ะฝะฐัั‚ะพัั‰ะธะน ะบะพัั„ั„ะธั†ะธะตะฝั‚
        
        System.out.println("ะ˜ะดะตะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ะน ะบะพัั„ั„ะธั†ะธะตะฝั‚ ัะถะฐั‚ะธั ั€ะฐะฒะตะฝ " + idealRatio);
        System.out.println("ะšะพัั„ั„ะธั†ะธะตะฝั‚ ัะถะฐั‚ะธั ั ัƒั‡ะตั‚ะพะผ ะบะพะดะธั€ะพะฒะพั‡ะฝะพะน ั‚ะฐะฑะปะธั†ั‹ " + realRatio);
    }

    public static void extract(String filePath, String tablePath) throws FileNotFoundException, IOException {
        HuffmanOperator operator = new HuffmanOperator();
        File compressedFile = new File(filePath),
        	 tableFile = new File(tablePath),
        	 extractedFile = new File(filePath + ".xtr");
        String compressed = "";
        String[] encodingArray = new String[ENCODING_TABLE_SIZE];
        //read compressed file
        //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!check here:
        try (FileInputHelper fi = new FileInputHelper(compressedFile)) {
        	byte b;
        	while (true) {
        		b = fi.readByte();//method returns EOFException
        		compressed += String.format("%8s", Integer.toBinaryString(b & 0xff)).replace(" ", "0");
        	}
        } catch (EOFException e) {
        	
        }
        
        //--------------------
        
        //read encoding table:
        try (FileInputHelper fi = new FileInputHelper(tableFile)) {
        	fi.readLine();//skip first empty string
        	encodingArray[(byte)'n'] = fi.readLine();//read code for 'n'
        	while (true) {
        		String s = fi.readLine();
        		if (s == null)
        			throw new EOFException();
        		encodingArray[(byte)s.charAt(0)] = s.substring(1, s.length());        		
        	}
        } catch (EOFException ignore) {}
        
        extractedFile.createNewFile();
        //extract:
		try (FileOutputHelper fo = new FileOutputHelper(extractedFile)) {
			fo.writeString(operator.extract(compressed, encodingArray));
		}
		
		System.out.println("ะŸัƒั‚ัŒ ะบ ั€ะฐัะฟะฐะบะพะฒะฐะฝะฝะพะผัƒ ั„ะฐะนะปัƒ " + extractedFile.getAbsolutePath());
    }
}

เจคเฉเจนเจพเจจเฉ‚เฉฐ readme.txt เจซเจพเจˆเจฒ เจ–เฉเจฆ เจฒเจฟเจ–เจฃเฉ€ เจชเจตเฉ‡เจ—เฉ€ :)

เจธเจฟเฉฑเจŸเจพ

เจฎเฉ‡เจฐเจพ เจ…เฉฐเจฆเจพเจœเจผเจพ เจนเฉˆ เจ•เจฟ เจฎเฉˆเจ‚ เจ‡เจนเฉ€ เจ•เจนเจฟเจฃเจพ เจšเจพเจนเฉเฉฐเจฆเจพ เจธเฉ€เฅค เจœเฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ•เฉ‹เจก, เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ, เจœเจพเจ‚ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒเจคเจพ เจจเฉ‚เฉฐ เจธเฉเจงเจพเจฐเจจ เจตเจฟเฉฑเจš เจฎเฉ‡เจฐเฉ€ เจ…เจฏเฉ‹เจ—เจคเจพ เจฌเจพเจฐเฉ‡ เจ•เฉเจ เจ•เจนเจฟเจฃเจพ เจนเฉˆ, เจคเจพเจ‚ เจฒเจฟเจ–เจฃ เจฒเจˆ เจธเฉเจคเฉฐเจคเจฐ เจฎเจนเจฟเจธเฉ‚เจธ เจ•เจฐเฉ‹เฅค เจœเฉ‡ เจฎเฉˆเจ‚ เจ•เฉเจ เจธเจฎเจเจพเจ‡เจ† เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจตเฉ€ เจฒเจฟเจ–เฉ‹. เจฎเฉˆเจ‚ เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจกเฉ‡ เจคเฉ‹เจ‚ เจธเฉเจฃเจจเจพ เจชเจธเฉฐเจฆ เจ•เจฐเจพเจ‚เจ—เจพ!

PS

เจนเจพเจ‚, เจนเจพเจ‚, เจฎเฉˆเจ‚ เจ…เจœเฉ‡ เจตเฉ€ เจ‡เฉฑเจฅเฉ‡ เจนเจพเจ‚, เจ•เจฟเจ‰เจ‚เจ•เจฟ เจฎเฉˆเจ‚ เจ—เฉเจฃเจพเจ‚เจ• เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจญเฉเฉฑเจฒเจฟเจ†เฅค เจธเจคเจฐ s1 เจฒเจˆ, เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจธเจพเจฐเจฃเฉ€ เจฆเจพ เจญเจพเจฐ 48 เจฌเจพเจˆเจŸ เจนเฉˆ - เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒ เจคเฉ‹เจ‚ เจฌเจนเฉเจค เจตเฉฑเจกเจพ, เจ…เจคเฉ‡ เจ…เจธเฉ€เจ‚ เจตเจพเจงเฉ‚ เจœเจผเฉ€เจฐเฉ‹ (เจœเฉ‹เฉœเฉ‡ เจ—เจ เจœเจผเฉ€เจฐเฉ‹ เจฆเฉ€ เจ—เจฟเจฃเจคเฉ€ 7 เจนเฉˆ) เจฌเจพเจฐเฉ‡ เจจเจนเฉ€เจ‚ เจญเฉเฉฑเจฒเฉ‡ => เจ•เฉฐเจชเจฐเฉˆเจธเจผเจจ เจ…เจจเฉเจชเจพเจค เจ‡เฉฑเจ• เจคเฉ‹เจ‚ เจ˜เฉฑเจŸ เจนเฉ‹เจตเฉ‡เจ—เจพ: 176/ (65 + 48*8 + 7) = 0.38เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจตเฉ€ เจ‡เจน เจฆเฉ‡เจ–เจฟเจ† เจนเฉˆ, เจคเจพเจ‚ เจ‡เจน เจธเจฟเจฐเจซเจผ เจคเฉเจนเจพเจกเจพ เจšเจฟเจนเจฐเจพ เจนเฉ€ เจจเจนเฉ€เจ‚ เจนเฉˆเฅค เจนเจพเจ‚, เจ‡เจน เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจ›เฉ‹เจŸเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฒเจˆ เจฌเจนเฉเจค เจ…เจ•เฉเจธเจผเจฒ เจนเฉ‹เจตเฉ‡เจ—เจพเฅค เจชเจฐ เจตเฉฑเจกเฉ€เจ†เจ‚ เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจ•เฉ€ เจนเฉเฉฐเจฆเจพ เจนเฉˆ? เจซเจพเจˆเจฒ เจฆเจพ เจ†เจ•เจพเจฐ เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจŸเฉ‡เจฌเจฒ เจฆเฉ‡ เจ†เจ•เจพเจฐ เจจเจพเจฒเฉ‹เจ‚ เจฌเจนเฉเจค เจตเฉฑเจกเจพ เจนเฉˆเฅค เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจเจฒเจ—เฉ‹เจฐเจฟเจฆเจฎ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ‡เจน เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ! เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฒเจˆ เจซเฉŒเจธเจŸ เจฆเจพ เจฎเฉ‹เจจเฉ‹เจฒเฉ‹เจ— เจ†เจฐเจ•เจพเจˆเจตเจฐ 1.46 เจฆเจพ เจ‡เฉฑเจ• เจ…เจธเจฒเฉ€ (เจ†เจฆเจฐเจธเจผ เจจเจนเฉ€เจ‚) เจ—เฉเจฃเจพเจ‚เจ• เจชเฉˆเจฆเจพ เจ•เจฐเจฆเจพ เจนเฉˆ - เจฒเจ—เจญเจ— เจกเฉ‡เจข เจ—เฉเจฃเจพ! เจ…เจคเฉ‡ เจนเจพเจ‚, เจซเจพเจˆเจฒ เจ…เฉฐเจ—เจฐเฉ‡เจœเจผเฉ€ เจตเจฟเฉฑเจš เจนเฉ‹เจฃเฉ€ เจšเจพเจนเฉ€เจฆเฉ€ เจธเฉ€เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹