Π₯Π°Ρ„ΠΌΠ°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π·Π° ΠΊΠΎΠΌΠΏΡ€Π΅ΡΠΈΡ˜Π°

Π’ΠΎ прСсрСт Π½Π° ΠΏΠΎΡ‡Π΅Ρ‚ΠΎΠΊΠΎΡ‚ Π½Π° курсот β€žΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ΠΈβ€œ Π—Π° вас ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΠ²ΠΌΠ΅ ΠΏΡ€Π΅Π²ΠΎΠ΄ Π½Π° ΡƒΡˆΡ‚Π΅ Π΅Π΄Π΅Π½ корисСн ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π».

ΠšΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π₯Π°Ρ„ΠΌΠ°Π½ Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ Π·Π° ΠΊΠΎΠΌΠΏΡ€Π΅ΡΠΈΡ˜Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ ја Ρ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€Π° основната идСја Π·Π° ΠΊΠΎΠΌΠΏΡ€Π΅ΡΠΈΡ˜Π° Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ. Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° ќС Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ со фиксна ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°, ΡƒΠ½ΠΈΠΊΠ°Ρ‚Π½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‡ΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ, ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° прСфикс ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π° Π½Π° Π΄Ρ€Π²ΠΎΡ‚ΠΎ Π₯Π°Ρ„ΠΌΠ°Π½.

Π—Π½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° сСкој Π·Π½Π°ΠΊ Π΅ Π·Π°Ρ‡ΡƒΠ²Π°Π½ ΠΊΠ°ΠΊΠΎ Π½ΠΈΠ·Π° ΠΎΠ΄ 0 ΠΈ 1 ΠΈ Π·Π°Ρ„Π°ΡœΠ° 8 Π±ΠΈΡ‚Π°. Ова сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ со фиксна Π΄ΠΎΠ»ΠΆΠΈΠ½Π° бидСјќи сСкој Π·Π½Π°ΠΊ користи ист фиксСн Π±Ρ€ΠΎΡ˜ Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅.

Π”Π° Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° тСкстот Π΅ Π΄Π°Π΄Π΅Π½. Како ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΠΌΠ΅ просторот ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅Π½ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π΅Π΄Π΅Π½ Π·Π½Π°ΠΊ?

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° идСја Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ со ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°. МоТСмС Π΄Π° Π³ΠΎ искористимС Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ Π·Π½Π°Ρ†ΠΈ сС ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°Π°Ρ‚ почСсто Π²ΠΎ тСкстот ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ (Π²ΠΈΠ΄ΠΈ ΠΎΠ²Π΄Π΅) Π΄Π° сС Ρ€Π°Π·Π²ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ кој ќС ја прСтставува истата Π½ΠΈΠ·Π° Π½Π° Π·Π½Π°Ρ†ΠΈ Π²ΠΎ ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ Π±ΠΈΡ‚ΠΎΠ²ΠΈ. Π’ΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ со ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°, Π½ΠΈΠ΅ Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ² Π±Ρ€ΠΎΡ˜ Π½Π° Π±ΠΈΡ‚ΠΎΠ²ΠΈ Π½Π° Π·Π½Π°Ρ†ΠΈ Π²ΠΎ зависност ΠΎΠ΄ зачСстСноста Π½Π° Π½ΠΈΠ²Π½ΠΎΡ‚ΠΎ ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅ Π²ΠΎ Π΄Π°Π΄Π΅Π½ тСкст. На ΠΊΡ€Π°Ρ˜ΠΎΡ‚ Π½Π° ΠΊΡ€Π°ΠΈΡˆΡ‚Π°Ρ‚Π°, Π½Π΅ΠΊΠΎΠΈ Π·Π½Π°Ρ†ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π·Π΅ΠΌΠ°Ρ‚ само 1 Π±ΠΈΡ‚, Π΄ΠΎΠ΄Π΅ΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π·Π°Π·Π΅ΠΌΠ°Ρ‚ 2 Π±ΠΈΡ‚Π°, 3 ΠΈΠ»ΠΈ повСќС. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΡ‚ со ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ со ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π° Π΅ само послСдоватСлното Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π½ΠΈΠ·Π°Ρ‚Π°.

Како, знаСјќи Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΠΈΡ‚ΠΎΠ²ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ нСдвосмислСно Π΄Π° ја Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚Π΅?

РазмислСтС Π·Π° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° "aabacdab". Има 8 Π·Π½Π°Ρ†ΠΈ, Π° со ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ со фиксна Π΄ΠΎΠ»ΠΆΠΈΠ½Π° ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈ 64 Π±ΠΈΡ‚Π° Π·Π° Π΄Π° сС складира. Π—Π°Π±Π΅Π»Π΅ΠΆΠ΅Ρ‚Π΅ Π΄Π΅ΠΊΠ° Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° симболот β€žΠ°β€œ, β€žΠ±β€œ, β€žΠ²β€œ ΠΈ "Π“" Π΅ Π΅Π΄Π½Π°ΠΊΠ²ΠΎ Π½Π° 4, 2, 1, 1 соодвСтно. АјдС Π΄Π° сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ Π΄Π° замислимС "aabacdab" Π²ΠΎ ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ Π±ΠΈΡ‚ΠΎΠ²ΠΈ, ΠΈΡΠΊΠΎΡ€ΠΈΡΡ‚ΡƒΠ²Π°Ρ˜ΡœΠΈ Π³ΠΎ Ρ„Π°ΠΊΡ‚ΠΎΡ‚ Π΄Π΅ΠΊΠ° "Π΄ΠΎ" сС Ρ˜Π°Π²ΡƒΠ²Π° почСсто ΠΎΠ΄ "Π‘"И "Π‘" сС Ρ˜Π°Π²ΡƒΠ²Π° почСсто ΠΎΠ΄ "Π²" ΠΈ "Π“". ЌС Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅ со ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ "Π΄ΠΎ" ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π΅Π΄Π΅Π½ Π±ΠΈΡ‚ Π΅Π΄Π½Π°ΠΊΠΎΠ² Π½Π° 0, "Π‘" ќС Π΄ΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ Π΄Π²ΠΎΠ±ΠΈΡ‚Π΅Π½ ΠΊΠΎΠ΄ Π½Π° 11, Π° со Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π° 100 ΠΈ 011 ќС ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ "Π²" ΠΈ "Π“".

Како Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ќС Π΄ΠΎΠ±ΠΈΠ΅ΠΌΠ΅:

a
0

b
11

c
100

d
011

Π’Π°ΠΊΠ° Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° "aabacdab" ќС Π³ΠΎ ΡˆΠΈΡ„Ρ€ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ 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
0

b
10

c
110

d
111

ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΎΠ²Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅, Π½ΠΈΠ·Π°Ρ‚Π° "aabacdab" ќС Π±ΠΈΠ΄Π°Ρ‚ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΈ ΠΊΠ°ΠΊΠΎ 00100100011010 (0|0|10|0|100|011|0|10). Но 00100100011010 сСга ΠΌΠΎΠΆΠ΅ΠΌΠ΅ нСдвосмислСно Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΠΌΠ΅ ΠΈ Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠ΅ Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π° Π½ΠΈΠ·Π° "aabacdab".

Π₯Π°Ρ„ΠΌΠ°Π½ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅

Π‘Π΅Π³Π° ΠΊΠΎΠ³Π° Π³ΠΎ Ρ€Π°Π·Π±ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ со ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π° ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΡ‚ΠΎ Π·Π° прСфиксот, ајдС Π΄Π° Π·Π±ΠΎΡ€ΡƒΠ²Π°ΠΌΠ΅ Π·Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° Π₯Π°Ρ„ΠΌΠ°Π½.

ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ сС заснова Π½Π° создавањС Π±ΠΈΠ½Π°Ρ€Π½ΠΈ Π΄Ρ€Π²Ρ˜Π°. Π’ΠΎ Π½Π΅Π³ΠΎ, јазол ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π΅Π½ ΠΈΠ»ΠΈ Π²Π½Π°Ρ‚Ρ€Π΅ΡˆΠ΅Π½. ΠŸΡ€Π²ΠΈΡ‡Π½ΠΎ, ситС јазли сС смСтаат Π·Π° лисја (ΠΊΡ€Π°Π΅Π²ΠΈ), ΠΊΠΎΠΈ Π³ΠΎ прСтставуваат самиот симбол ΠΈ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° Ρ‚Π΅ΠΆΠΈΠ½Π° (односно Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π°Ρ‚Π° Π½Π° ΠΏΠΎΡ˜Π°Π²ΡƒΠ²Π°ΡšΠ΅). Π’Π½Π°Ρ‚Ρ€Π΅ΡˆΠ½ΠΈΡ‚Π΅ јазли ја содрТат Ρ‚Π΅ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° Π»ΠΈΠΊΠΎΡ‚ ΠΈ сС однСсуваат Π½Π° Π΄Π²Π° наслСднички јазли. По ΠΎΠΏΡˆΡ‚ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€, ΠΌΠ°Π»ΠΊΡƒ Β«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++, ја користимС класата стринг Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π° Π½ΠΈΠ·Π° Π·Π° Π΄Π° ја Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ°Ρ‚Π° Ρ‡ΠΈΡ‚Π»ΠΈΠ²Π°.

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ СфикаснитС структури Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π·Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Π° Ρ€Π΅Π΄ΠΈΡ†Π° Π±Π°Ρ€Π°Π°Ρ‚ ΠΏΠΎ Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅ О (Π»ΠΎΠ³ (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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€