แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒ•แƒ แƒฐแƒแƒคแƒ›แƒแƒœแƒ˜แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒ—

Entry

แƒแƒ› แƒกแƒขแƒแƒขแƒ˜แƒแƒจแƒ˜ แƒ•แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒ‘ แƒฐแƒแƒคแƒ›แƒแƒœแƒ˜แƒก แƒชแƒœแƒแƒ‘แƒ˜แƒš แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ–แƒ”, แƒแƒกแƒ”แƒ•แƒ” แƒ›แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒแƒ–แƒ” แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒ•แƒ˜แƒกแƒแƒก.

แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ— แƒ›แƒแƒ แƒขแƒ˜แƒ• แƒแƒ แƒฅแƒ˜แƒ•แƒก. แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒ˜แƒงแƒ แƒกแƒขแƒแƒขแƒ˜แƒ แƒฐแƒแƒ‘แƒ แƒ”แƒ–แƒ”, แƒ›แƒแƒ’แƒ แƒแƒ› แƒžแƒ แƒแƒฅแƒขแƒ˜แƒ™แƒฃแƒšแƒ˜ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”. แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ” แƒžแƒแƒกแƒขแƒ˜แƒก แƒ—แƒ”แƒแƒ แƒ˜แƒฃแƒšแƒ˜ แƒ›แƒแƒกแƒแƒšแƒ แƒแƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒกแƒ™แƒแƒšแƒ˜แƒก แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒฃแƒšแƒ˜ แƒ›แƒ”แƒชแƒœแƒ˜แƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒšแƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ แƒแƒ‘แƒ”แƒ แƒข แƒšแƒแƒคแƒแƒ แƒ”แƒขแƒ˜แƒก แƒฌแƒ˜แƒ’แƒœแƒ˜แƒ“แƒแƒœ โ€žแƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒกแƒขแƒ แƒฃแƒฅแƒขแƒฃแƒ แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ”แƒ‘แƒ˜ แƒฏแƒแƒ•แƒแƒจแƒ˜โ€œ. แƒแƒกแƒ” แƒ แƒแƒ›, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒแƒญแƒ แƒ˜แƒšแƒ˜แƒ!

แƒžแƒแƒขแƒแƒ แƒ แƒแƒœแƒแƒ แƒ”แƒ™แƒšแƒ˜

แƒฉแƒ•แƒ”แƒฃแƒšแƒ”แƒ‘แƒ แƒ˜แƒ• แƒขแƒ”แƒฅแƒกแƒขแƒฃแƒ  แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ”แƒ แƒ—แƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒšแƒ˜แƒ 8 แƒ‘แƒ˜แƒขแƒ˜แƒ— (ASCII แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ) แƒแƒœ 16 (Unicode แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ). แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ•แƒ— ASCII แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒแƒก. แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒ˜แƒฆแƒ”แƒ— แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜ s1 = "SUSIE SAYS IT IS EASYn". แƒกแƒแƒ”แƒ แƒ—แƒ แƒฏแƒแƒ›แƒจแƒ˜, แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒจแƒ˜ 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. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— Node แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒ“แƒแƒœ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒกแƒ—แƒ•แƒ˜แƒก (แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜ s1). แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜, แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ 9 แƒ™แƒ•แƒแƒœแƒซแƒ˜ (Node แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ˜). แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜ แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒแƒ แƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ•แƒ”แƒšแƒ˜แƒกแƒแƒ’แƒแƒœ: แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒ“แƒ แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ”
  2. แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒฎแƒ˜แƒก แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ˜ (BinaryTree) แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒก แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ™แƒ•แƒแƒœแƒซแƒ˜ แƒฎแƒ“แƒ”แƒ‘แƒ แƒฎแƒ˜แƒก แƒคแƒ”แƒกแƒ•แƒ˜.
  3. แƒฉแƒแƒ“แƒ”แƒ— แƒ”แƒก แƒฎแƒ”แƒ”แƒ‘แƒ˜ แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒฃแƒš แƒ แƒ˜แƒ’แƒจแƒ˜. แƒ แƒแƒช แƒฃแƒคแƒ แƒ แƒ“แƒแƒ‘แƒแƒšแƒ˜แƒ แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ”, แƒ›แƒ˜แƒ— แƒฃแƒคแƒ แƒ แƒ›แƒแƒฆแƒแƒšแƒ˜แƒ แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒ˜. แƒแƒ›แƒ แƒ˜แƒ’แƒแƒ“, แƒ›แƒแƒžแƒแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก แƒงแƒแƒ•แƒ”แƒšแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ˜แƒ แƒฉแƒ”แƒ•แƒ แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ“แƒแƒ‘แƒแƒšแƒ˜ แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ˜แƒก แƒฎแƒ”.

แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒชแƒ˜แƒ™แƒšแƒฃแƒ แƒแƒ“ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜:

  1. แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒแƒ แƒ˜ แƒฎแƒ” แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒฃแƒšแƒ˜ แƒ แƒ˜แƒ’แƒ˜แƒ“แƒแƒœ แƒ“แƒ แƒ’แƒแƒฎแƒแƒ“แƒ”แƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒก แƒจแƒ•แƒ˜แƒšแƒ”แƒ‘แƒแƒ“ (แƒแƒฎแƒšแƒแƒ“ แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜ แƒแƒกแƒแƒก แƒ’แƒแƒ แƒ”แƒจแƒ”). แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒก แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ” แƒฃแƒ“แƒ แƒ˜แƒก แƒแƒ แƒ˜ แƒจแƒ—แƒแƒ›แƒแƒ›แƒแƒ•แƒแƒšแƒ˜ แƒฎแƒ˜แƒก แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ”แƒ”แƒ‘แƒ˜แƒก แƒฏแƒแƒ›แƒก.
  2. แƒแƒ› แƒ™แƒ•แƒแƒœแƒซแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒแƒ› แƒ™แƒ•แƒแƒœแƒซแƒ–แƒ” แƒ“แƒแƒคแƒฃแƒซแƒœแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒฎแƒ”. แƒฉแƒแƒ“แƒ”แƒ— แƒ”แƒก แƒฎแƒ” แƒ˜แƒกแƒ”แƒ• แƒžแƒ แƒ˜แƒแƒ แƒ˜แƒขแƒ”แƒขแƒฃแƒš แƒ แƒ˜แƒ’แƒจแƒ˜. (แƒ แƒแƒ“แƒ’แƒแƒœ แƒฎแƒ”แƒก แƒแƒฎแƒแƒšแƒ˜ แƒกแƒ˜แƒฎแƒจแƒ˜แƒ แƒ” แƒแƒฅแƒ•แƒก, แƒ˜แƒก แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ“ แƒแƒฎแƒแƒš แƒแƒ“แƒ’แƒ˜แƒšแƒ–แƒ” แƒ›แƒแƒฎแƒ•แƒ“แƒ”แƒ‘แƒ แƒ แƒ˜แƒ’แƒจแƒ˜)
  3. แƒ’แƒแƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ— 1 แƒ“แƒ 2 แƒœแƒแƒ‘แƒ˜แƒฏแƒ”แƒ‘แƒ˜, แƒกแƒแƒœแƒแƒ› แƒ แƒ˜แƒ’แƒจแƒ˜ แƒแƒ  แƒ“แƒแƒ แƒฉแƒ”แƒ‘แƒ แƒ”แƒ แƒ—แƒ˜ แƒฎแƒ” - แƒฐแƒแƒคแƒ›แƒแƒœแƒ˜แƒก แƒฎแƒ”

แƒ’แƒแƒœแƒ•แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒ”แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ–แƒ” s1:

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒจแƒ”แƒ™แƒฃแƒ›แƒจแƒ•แƒ แƒฐแƒแƒคแƒ›แƒแƒœแƒ˜แƒก แƒแƒšแƒ’แƒแƒ แƒ˜แƒ—แƒ›แƒ˜แƒ—

แƒแƒฅ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ "lf" (linefeed) แƒแƒฆแƒœแƒ˜แƒจแƒœแƒแƒ•แƒก แƒแƒฎแƒแƒš แƒฎแƒแƒ–แƒก, "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 แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒ’แƒแƒ แƒ”แƒจแƒ”? แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒ—แƒ˜, แƒ›แƒฎแƒแƒšแƒแƒ“ java แƒ˜แƒœแƒกแƒขแƒ แƒฃแƒ›แƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒ—, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘ แƒคแƒแƒ˜แƒšแƒจแƒ˜ แƒ’แƒแƒ›แƒแƒขแƒแƒœแƒ˜แƒกแƒแƒก, แƒแƒฎแƒแƒšแƒ˜ แƒฎแƒแƒ–แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ - 'n' - แƒ’แƒแƒ แƒ“แƒแƒ˜แƒฅแƒ›แƒœแƒ”แƒ‘แƒ แƒแƒฎแƒแƒš แƒฎแƒแƒ–แƒแƒ“ (แƒ แƒแƒช แƒแƒ  แƒฃแƒœแƒ“แƒ แƒกแƒฃแƒšแƒ”แƒšแƒฃแƒ แƒแƒ“ แƒŸแƒฆแƒ”แƒ แƒ“แƒ”แƒก). แƒแƒฅแƒ”แƒ“แƒแƒœ แƒ’แƒแƒ›แƒแƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”, แƒชแƒแƒ แƒ˜แƒ”แƒšแƒ˜ แƒฎแƒแƒ–แƒ˜ แƒ–แƒ”แƒ›แƒแƒ— แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ 01110 แƒ™แƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. 00 แƒ™แƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒ•แƒ แƒชแƒ” แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜แƒก แƒ“แƒแƒกแƒแƒฌแƒงแƒ˜แƒกแƒจแƒ˜. แƒ“แƒแƒฃแƒงแƒแƒ•แƒœแƒ”แƒ‘แƒšแƒ˜แƒ• แƒฃแƒœแƒ“แƒ แƒ•แƒ—แƒฅแƒ•แƒ, แƒ แƒแƒ› แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒก แƒจแƒ”แƒœแƒแƒฎแƒ•แƒ˜แƒก แƒ”แƒก แƒ›แƒ”แƒ—แƒแƒ“แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ˜แƒงแƒแƒก แƒงแƒ•แƒ”แƒšแƒแƒ–แƒ” แƒ˜แƒ แƒแƒชแƒ˜แƒแƒœแƒแƒšแƒฃแƒ แƒ˜ แƒฉแƒ•แƒ”แƒœแƒ˜ แƒฎแƒแƒœแƒ˜แƒก แƒ™แƒแƒ”แƒคแƒ˜แƒชแƒ˜แƒ”แƒœแƒขแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก. แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ“แƒ•แƒ˜แƒšแƒ˜ แƒ’แƒแƒกแƒแƒ’แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒแƒ. แƒ›แƒแƒฎแƒแƒ แƒฃแƒšแƒ˜ แƒ•แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ˜ แƒ›แƒแƒ•แƒ˜แƒกแƒ›แƒ˜แƒœแƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒแƒชแƒ˜แƒ”แƒ‘แƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜ แƒแƒžแƒขแƒ˜แƒ›แƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘.

แƒแƒ› แƒชแƒฎแƒ แƒ˜แƒšแƒ˜แƒ— แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒจแƒ˜แƒคแƒ•แƒ แƒ แƒซแƒแƒšแƒ˜แƒแƒœ แƒแƒ“แƒ•แƒ˜แƒšแƒ˜แƒ. แƒ’แƒแƒ•แƒ˜แƒฎแƒกแƒ”แƒœแƒแƒ— แƒ แƒ แƒฌแƒ”แƒกแƒ˜แƒ— แƒ•แƒ˜แƒฎแƒ”แƒšแƒ›แƒซแƒฆแƒ•แƒแƒœแƒ”แƒšแƒ”แƒ— แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก:

แƒแƒ แƒชแƒ”แƒ แƒ—แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ˜แƒงแƒแƒก แƒกแƒฎแƒ•แƒ แƒžแƒ แƒ”แƒคแƒ˜แƒฅแƒกแƒ˜

แƒแƒฅ แƒ˜แƒก แƒ—แƒแƒ›แƒแƒจแƒแƒ‘แƒก แƒฎแƒ”แƒšแƒจแƒ”แƒ›แƒฌแƒงแƒแƒ‘ แƒ แƒแƒšแƒก. แƒฉแƒ•แƒ”แƒœ แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ— แƒ‘แƒ˜แƒข-แƒ‘แƒ˜แƒขแƒ˜ แƒ—แƒแƒœแƒ›แƒ˜แƒ›แƒ“แƒ”แƒ•แƒ แƒแƒ‘แƒ˜แƒ— แƒ“แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ™แƒ˜ แƒ›แƒ˜แƒฆแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ“แƒ’แƒ”แƒ‘แƒ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒ˜ แƒ‘แƒ˜แƒขแƒ”แƒ‘แƒ˜แƒกแƒแƒ’แƒแƒœ, แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒก แƒ“แƒแƒจแƒ˜แƒคแƒ•แƒ แƒแƒก, แƒ›แƒแƒจแƒ˜แƒœแƒ•แƒ” แƒ•แƒ˜แƒชแƒ˜แƒ—, แƒ แƒแƒ› แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ (แƒ“แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ˜แƒก!) แƒ˜แƒงแƒ แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜. แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒ˜, แƒฉแƒ•แƒ”แƒœ แƒ•แƒฌแƒ”แƒ แƒ— แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒแƒก แƒ“แƒ”แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ–แƒ” (แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ“แƒ”แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒจแƒ”แƒขแƒงแƒแƒ‘แƒ˜แƒœแƒ”แƒ‘แƒแƒก), แƒ’แƒแƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ— d แƒกแƒขแƒ แƒ˜แƒฅแƒแƒœแƒก แƒ“แƒ แƒ•แƒ™แƒ˜แƒ—แƒฎแƒฃแƒšแƒแƒ‘แƒ— แƒ“แƒแƒจแƒ˜แƒคแƒ แƒฃแƒš แƒคแƒแƒ˜แƒšแƒก แƒจแƒ”แƒ›แƒ“แƒ’แƒแƒ›แƒจแƒ˜.

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

แƒ“แƒ แƒแƒ แƒ“แƒแƒ•แƒแƒ›แƒชแƒ˜แƒ แƒ แƒฉแƒ”แƒ›แƒ˜ แƒ™แƒแƒ“แƒ˜ แƒแƒ แƒฅแƒ˜แƒ•แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒ—. แƒ“แƒแƒ•แƒแƒ แƒฅแƒ•แƒแƒ— แƒ™แƒแƒ›แƒžแƒ แƒ”แƒกแƒแƒ แƒ˜.

แฒ—แƒแƒ•แƒ˜แƒ“แƒแƒœ แƒ“แƒแƒฌแƒงแƒ”แƒ‘แƒ. แƒฃแƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ”แƒก แƒงแƒแƒ•แƒšแƒ˜แƒกแƒ, แƒฉแƒ•แƒ”แƒœ แƒ•แƒฌแƒ”แƒ แƒ— Node แƒ™แƒšแƒแƒกแƒก:

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

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ