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

ΠŸΡ€Π΅ ΠΏΠΎΡ‡Π΅Ρ‚ΠΊΠ° курса β€žΠΠ»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€Π΅β€œ ΠΏΡ€ΠΈΠΏΡ€Π΅ΠΌΠΈΠΎ Π·Π° вас ΠΏΡ€Π΅Π²ΠΎΠ΄ још јСдног корисног ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π»Π°.

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

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

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

Π“Π»Π°Π²Π½Π° идСја јС ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ Π΄ΡƒΠΆΠΈΠ½Π΅. МоТСмо искористити Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†Ρƒ Π΄Π° сС Π½Π΅ΠΊΠΈ Π·Π½Π°ΠΊΠΎΠ²ΠΈ Ρƒ тСксту Ρ˜Π°Π²Ρ™Π°Ρ˜Ρƒ Ρ‡Π΅ΡˆΡ›Π΅ ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΡ… (ΠΏΠΎΠ³Π»Π΅Π΄Π°Ρ˜Ρ‚Π΅ ΠΎΠ²Π΄Π΅) Π΄Π° сС Ρ€Π°Π·Π²ΠΈΡ˜Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ који Ρ›Π΅ прСдстављати исти Π½ΠΈΠ· Π·Π½Π°ΠΊΠΎΠ²Π° Ρƒ мањС Π±ΠΈΡ‚ΠΎΠ²Π°. Π£ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΡƒ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ Π΄ΡƒΠΆΠΈΠ½Π΅, ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€ΠΈΠΌΠ° Π΄ΠΎΠ΄Π΅Ρ™ΡƒΡ˜Π΅ΠΌΠΎ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ² Π±Ρ€ΠΎΡ˜ Π±ΠΈΡ‚ΠΎΠ²Π°, Ρƒ зависности ΠΎΠ΄ Ρ‚ΠΎΠ³Π° ΠΊΠΎΠ»ΠΈΠΊΠΎ сС чСсто ΠΏΠΎΡ˜Π°Π²Ρ™ΡƒΡ˜Ρƒ Ρƒ Π΄Π°Ρ‚ΠΎΠΌ тСксту. На ΠΊΡ€Π°Ρ˜Ρƒ, Π½Π΅ΠΊΠΈ Π·Π½Π°ΠΊΠΎΠ²ΠΈ ΠΌΠΎΠ³Ρƒ Π·Π°ΡƒΠ·Π΅Ρ‚ΠΈ само 1 Π±ΠΈΡ‚, Π΄ΠΎΠΊ Π΄Ρ€ΡƒΠ³ΠΈ ΠΌΠΎΠ³Ρƒ Π·Π°ΡƒΠ·Π΅Ρ‚ΠΈ 2 Π±ΠΈΡ‚Π°, 3 ΠΈΠ»ΠΈ вишС. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ са ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ Π΄ΡƒΠΆΠΈΠ½Π΅ јС само Π½Π°ΠΊΠ½Π°Π΄Π½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ сСквСнцС.

Како, Π·Π½Π°Ρ˜ΡƒΡ›ΠΈ рСдослСд Π±ΠΈΡ‚ΠΎΠ²Π°, нСдвосмислСно Π³Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ΠΈ?

Π Π°Π·ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π»ΠΈΠ½ΠΈΡ˜Ρƒ "Π°Π±Π°Ρ†Π΄Π°Π±". Има 8 Π·Π½Π°ΠΊΠΎΠ²Π°, Π° ΠΊΠ°Π΄Π° сС ΠΊΠΎΠ΄ΠΈΡ€Π° фикснС Π΄ΡƒΠΆΠΈΠ½Π΅, Π±ΠΈΡ›Π΅ ΠΌΡƒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ 64 Π±ΠΈΡ‚Π° Π΄Π° Π³Π° сачува. Π˜ΠΌΠ°Ρ˜Ρ‚Π΅ Π½Π° ΡƒΠΌΡƒ Π΄Π° Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π° симбола "Π°", "Π±", "Ρ†" ΠΈ "Π”" јСднако 4, 2, 1, 1 рСспСктивно. Π₯ајдС Π΄Π° ΠΏΠΎΠΊΡƒΡˆΠ°ΠΌΠΎ Π΄Π° замислимо "Π°Π±Π°Ρ†Π΄Π°Π±" мањС Π±ΠΈΡ‚ΠΎΠ²Π°, користСћи Ρ‡ΠΈΡšΠ΅Π½ΠΈΡ†Ρƒ Π΄Π° "Π΄ΠΎ" Ρ˜Π°Π²Ρ™Π° сС Ρ‡Π΅ΡˆΡ›Π΅ ΠΎΠ΄ "Π‘"И "Π‘" Ρ˜Π°Π²Ρ™Π° сС Ρ‡Π΅ΡˆΡ›Π΅ ΠΎΠ΄ "Ρ†" ΠΈ "Π”". ΠŸΠΎΡ‡Π½ΠΈΠΌΠΎ са ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ΠΌ "Π΄ΠΎ" са јСдним Π±ΠΈΡ‚ΠΎΠΌ јСднаким 0, "Π‘" Π΄ΠΎΠ΄Π΅Π»ΠΈΡ›Π΅ΠΌΠΎ Π΄Π²ΠΎΠ±ΠΈΡ‚Π½ΠΈ ΠΊΠΎΠ΄ 11, Π° користСћи Ρ‚Ρ€ΠΈ Π±ΠΈΡ‚Π° 100 ΠΈ 011 Ρ›Π΅ΠΌΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ΠΈ "Ρ†" ΠΈ "Π”".

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

a
0

b
11

c
100

d
011

Π”Π°ΠΊΠ»Π΅, линија "Π°Π±Π°Ρ†Π΄Π°Π±" ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ›Π΅ΠΌΠΎ ΠΊΠ°ΠΎ 00110100011011 (0|0|11|0|100|011|0|11)користСћи Π³ΠΎΡ€Π΅ Π½Π°Π²Π΅Π΄Π΅Π½Π΅ ΠΊΠΎΠ΄ΠΎΠ²Π΅. ΠœΠ΅Ρ’ΡƒΡ‚ΠΈΠΌ, Π³Π»Π°Π²Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ Ρ›Π΅ Π±ΠΈΡ‚ΠΈ Ρƒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΡƒ. Када ΠΏΠΎΠΊΡƒΡˆΠ°ΠΌΠΎ Π΄Π° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°ΠΌΠΎ Π½ΠΈΠ· 00110100011011, добијамо двосмислСн Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚, ΠΏΠΎΡˆΡ‚ΠΎ сС ΠΌΠΎΠΆΠ΅ прСдставити ΠΊΠ°ΠΎ:

0|011|0|100|011|0|11    adacdab
0|0|11|0|100|0|11|011   aabacabd
0|011|0|100|0|11|0|11   adacabab 

...
ΠΈΡ‚Π΄

Π”Π° бисмо ΠΈΠ·Π±Π΅Π³Π»ΠΈ ΠΎΠ²Ρƒ двосмислСност, ΠΌΠΎΡ€Π°ΠΌΠΎ осигурати Π΄Π° нашС ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ Π·Π°Π΄ΠΎΠ²ΠΎΡ™Π°Π²Π° ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ ΠΊΠ°ΠΎ ΡˆΡ‚ΠΎ јС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСфикса, ΡˆΡ‚ΠΎ Π·Π°ΡƒΠ·Π²Ρ€Π°Ρ‚ ΠΈΠΌΠΏΠ»ΠΈΡ†ΠΈΡ€Π° Π΄Π° сС ΠΊΠΎΠ΄ΠΎΠ²ΠΈ ΠΌΠΎΠ³Ρƒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ΠΈ само Π½Π° јСдан Ρ˜Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½ Π½Π°Ρ‡ΠΈΠ½. ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ прСфикса осигурава Π΄Π° нијСдан ΠΊΠΎΠ΄ нијС прСфикс Π΄Ρ€ΡƒΠ³ΠΎΠ³. Под ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°ΠΌΠΎ Π±ΠΈΡ‚ΠΎΠ²Π΅ који сС користС Π·Π° ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Ρ™Π°ΡšΠ΅ ΠΎΠ΄Ρ€Π΅Ρ’Π΅Π½ΠΎΠ³ ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π°. Π£ Π³ΠΎΡ€ΡšΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ 0 јС прСфикс 011, ΡˆΡ‚ΠΎ ΠΊΡ€ΡˆΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСфикса. Π”Π°ΠΊΠ»Π΅, Π°ΠΊΠΎ наши ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π·Π°Π΄ΠΎΠ²ΠΎΡ™Π°Π²Π°Ρ˜Ρƒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСфикса, ΠΎΠ½Π΄Π° ΠΌΠΎΠΆΠ΅ΠΌΠΎ Ρ˜Π΅Π΄ΠΈΠ½ΡΡ‚Π²Π΅Π½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ΠΈ (ΠΈ ΠΎΠ±Ρ€Π½ΡƒΡ‚ΠΎ).

Π₯ајдС Π΄Π° сС Π²Ρ€Π°Ρ‚ΠΈΠΌΠΎ Π½Π° Π³ΠΎΡ€ΡšΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Овај ΠΏΡƒΡ‚ Ρ›Π΅ΠΌΠΎ Π΄ΠΎΠ΄Π΅Π»ΠΈΡ‚ΠΈ симболС "Π°", "Π±", "Ρ†" ΠΈ "Π”" ΠΊΠΎΠ΄ΠΎΠ²ΠΈ који Π·Π°Π΄ΠΎΠ²ΠΎΡ™Π°Π²Π°Ρ˜Ρƒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ прСфикса.

a
0

b
10

c
110

d
111

Π‘Π° ΠΎΠ²ΠΈΠΌ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ΠΌ, стринг "Π°Π±Π°Ρ†Π΄Π°Π±" Π±ΠΈΡ›Π΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΎ ΠΊΠ°ΠΎ 00100100011010 (0|0|10|0|100|011|0|10). Али 00100100011010 Π²Π΅Ρ› Ρ›Π΅ΠΌΠΎ ΠΌΠΎΡ›ΠΈ нСдвосмислСно Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€Π°Ρ‚ΠΈ ΠΈ Π²Ρ€Π°Ρ‚ΠΈΡ‚ΠΈ сС Π½Π° наш ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈ Π½ΠΈΠ· "Π°Π±Π°Ρ†Π΄Π°Π±".

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

Π‘Π°Π΄Π° ΠΊΠ°Π΄Π° смо сС ΠΏΠΎΠ·Π°Π±Π°Π²ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ΠΌ ΠΏΡ€ΠΎΠΌΠ΅Π½Ρ™ΠΈΠ²Π΅ Π΄ΡƒΠΆΠΈΠ½Π΅ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ прСфикса, Ρ…Π°Ρ˜Π΄Π΅ Π΄Π° ΠΏΡ€ΠΈΡ‡Π°ΠΌΠΎ ΠΎ Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ²ΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΡƒ.

ΠœΠ΅Ρ‚ΠΎΠ΄Π° сС заснива Π½Π° ΠΊΡ€Π΅ΠΈΡ€Π°ΡšΡƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΡ… стабала. Π£ ΡšΠ΅ΠΌΡƒ Ρ‡Π²ΠΎΡ€ ΠΌΠΎΠΆΠ΅ Π±ΠΈΡ‚ΠΈ ΠΊΠΎΠ½Π°Ρ‡Π°Π½ ΠΈΠ»ΠΈ ΡƒΠ½ΡƒΡ‚Ρ€Π°ΡˆΡšΠΈ. Π£ ΠΏΠΎΡ‡Π΅Ρ‚ΠΊΡƒ сС сви Ρ‡Π²ΠΎΡ€ΠΎΠ²ΠΈ ΡΠΌΠ°Ρ‚Ρ€Π°Ρ˜Ρƒ листовима (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΈΠΌΠ°), који ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Ρ™Π°Ρ˜Ρƒ сам симбол ΠΈ ΡšΠ΅Π³ΠΎΠ²Ρƒ Ρ‚Π΅ΠΆΠΈΠ½Ρƒ (односно учСсталост ΠΏΠΎΡ˜Π°Π²Ρ™ΠΈΠ²Π°ΡšΠ°). Π£Π½ΡƒΡ‚Ρ€Π°ΡˆΡšΠΈ Ρ‡Π²ΠΎΡ€ΠΎΠ²ΠΈ садрТС Ρ‚Π΅ΠΆΠΈΠ½Ρƒ ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π° ΠΈ односС сС Π½Π° Π΄Π²Π° Ρ‡Π²ΠΎΡ€Π° ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. По ΠΎΠΏΡˆΡ‚Π΅ΠΌ Π΄ΠΎΠ³ΠΎΠ²ΠΎΡ€Ρƒ, Π±ΠΈΡ‚ «КБНУМКБ» прСдставља ΠΏΡ€Π°Ρ›Π΅ΡšΠ΅ Π»Π΅Π²Π΅ Π³Ρ€Π°Π½Π΅, ΠΈ «КБНУМКБ» - Π½Π° дСсној. Ρƒ ΠΏΡƒΠ½ΠΎΠΌ стаблу N листови ΠΈ Н-КБНУМКБ ΡƒΠ½ΡƒΡ‚Ρ€Π°ΡˆΡšΠΈ Ρ‡Π²ΠΎΡ€ΠΎΠ²ΠΈ. ΠŸΡ€Π΅ΠΏΠΎΡ€ΡƒΡ‡ΡƒΡ˜Π΅ сС Π΄Π° сС ΠΏΡ€ΠΈΠ»ΠΈΠΊΠΎΠΌ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡΠ°ΡšΠ° Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ²ΠΎΠ³ Π΄Ρ€Π²Π΅Ρ‚Π° Π½Π΅ΠΈΡΠΊΠΎΡ€ΠΈΡˆΡ›Π΅Π½ΠΈ симболи ΠΎΠ΄Π±Π°Ρ†Π΅ ΠΊΠ°ΠΊΠΎ Π±ΠΈ сС Π΄ΠΎΠ±ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Π΄ΡƒΠΆΠΈΠ½Π΅.

ΠšΠΎΡ€ΠΈΡΡ‚ΠΈΡ›Π΅ΠΌΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΈ Ρ€Π΅Π΄ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠΎ Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ²ΠΎ стабло, Π³Π΄Π΅ Ρ›Π΅ Ρ‡Π²ΠΎΡ€ са најниТом Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜ΠΎΠΌ Π΄ΠΎΠ±ΠΈΡ‚ΠΈ Π½Π°Ρ˜Π²Π΅Ρ›ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. ΠšΠΎΡ€Π°Ρ†ΠΈ ΠΈΠ·Π³Ρ€Π°Π΄ΡšΠ΅ су описани Ρƒ наставку:

  1. ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ лисни Ρ‡Π²ΠΎΡ€ Π·Π° сваки Π·Π½Π°ΠΊ ΠΈ Π΄ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ ΠΈΡ… Ρƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΈ Ρ€Π΅Π΄.
  2. Π”ΠΎΠΊ ΠΏΠΎΡΡ‚ΠΎΡ˜ΠΈ вишС ΠΎΠ΄ јСдног листа Ρƒ Ρ€Π΅Π΄Ρƒ, ΡƒΡ€Π°Π΄ΠΈΡ‚Π΅ слСдСћС:
    • Π£ΠΊΠ»ΠΎΠ½ΠΈΡ‚Π΅ Π΄Π²Π° Ρ‡Π²ΠΎΡ€Π° са највишим ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ (најниТом Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜ΠΎΠΌ) ΠΈΠ· Ρ€Π΅Π΄Π°;
    • НаправитС Π½ΠΎΠ²ΠΈ ΡƒΠ½ΡƒΡ‚Ρ€Π°ΡˆΡšΠΈ Ρ‡Π²ΠΎΡ€, Π³Π΄Π΅ Ρ›Π΅ ΠΎΠ²Π° Π΄Π²Π° Ρ‡Π²ΠΎΡ€Π° Π±ΠΈΡ‚ΠΈ Π΄Π΅Ρ†Π°, Π° учСсталост ΠΏΠΎΡ˜Π°Π²Ρ™ΠΈΠ²Π°ΡšΠ° Ρ›Π΅ Π±ΠΈΡ‚ΠΈ јСднака Π·Π±ΠΈΡ€Ρƒ Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π° ΠΎΠ²Π° Π΄Π²Π° Ρ‡Π²ΠΎΡ€Π°.
    • Π”ΠΎΠ΄Π°Ρ˜Ρ‚Π΅ Π½ΠΎΠ²ΠΈ Ρ‡Π²ΠΎΡ€ Ρƒ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½ΠΈ Ρ€Π΅Π΄.
  3. ЈСдини прСостали Ρ‡Π²ΠΎΡ€ Π±ΠΈΡ›Π΅ ΠΊΠΎΡ€Π΅Π½ ΠΈ Ρ‚ΠΈΠΌΠ΅ Ρ›Π΅ сС Π·Π°Π²Ρ€ΡˆΠΈΡ‚ΠΈ ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ˜Π° Π΄Ρ€Π²Π΅Ρ‚Π°.

ЗамислитС Π΄Π° ΠΈΠΌΠ°ΠΌΠΎ Π½Π΅ΠΊΠΈ тСкст који сС ΡΠ°ΡΡ‚ΠΎΡ˜ΠΈ само ΠΎΠ΄ Π·Π½Π°ΠΊΠΎΠ²Π° "Π° Π± Ρ† Π΄" ΠΈ "ΠΈ", Π° Ρ„Ρ€Π΅ΠΊΠ²Π΅Π½Ρ†ΠΈΡ˜Π΅ ΡšΠΈΡ…ΠΎΠ²ΠΎΠ³ ΠΏΠΎΡ˜Π°Π²Ρ™ΠΈΠ²Π°ΡšΠ° су 15, 7, 6, 6 ΠΈ 5, рСспСктивно. Испод су ΠΈΠ»ΡƒΡΡ‚Ρ€Π°Ρ†ΠΈΡ˜Π΅ којС ΠΎΠ΄Ρ€Π°ΠΆΠ°Π²Π°Ρ˜Ρƒ ΠΊΠΎΡ€Π°ΠΊΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°.

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

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

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

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

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

ΠŸΡƒΡ‚Π°ΡšΠ° ΠΎΠ΄ ΠΊΠΎΡ€Π΅Π½Π° Π΄ΠΎ Π±ΠΈΠ»ΠΎ ΠΊΠΎΠ³ ΠΊΡ€Π°Ρ˜ΡšΠ΅Π³ Ρ‡Π²ΠΎΡ€Π° Ρ›Π΅ ΡƒΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚ΠΈΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈ ΠΊΠΎΠ΄ прСфикса (Ρ‚Π°ΠΊΠΎΡ’Π΅ ΠΏΠΎΠ·Π½Π°Ρ‚ ΠΊΠ°ΠΎ Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ² ΠΊΠΎΠ΄) који ΠΎΠ΄Π³ΠΎΠ²Π°Ρ€Π° ΠΊΠ°Ρ€Π°ΠΊΡ‚Π΅Ρ€Ρƒ ΠΏΠΎΠ²Π΅Π·Π°Π½ΠΎΠΌ са Ρ‚ΠΈΠΌ ΠΊΡ€Π°Ρ˜ΡšΠΈΠΌ Ρ‡Π²ΠΎΡ€ΠΎΠΌ.

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

Испод Ρ›Π΅Ρ‚Π΅ Π½Π°Ρ›ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Ρƒ Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ²ΠΎΠ³ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΊΠΎΠΌΠΏΡ€Π΅ΡΠΈΡ˜Π΅ Ρƒ Π¦++ ΠΈ Јави:

#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%. Π£ Π¦++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΡƒ ΠΈΠ·Π½Π°Π΄, користимо стринг класу Π·Π° Ρ‡ΡƒΠ²Π°ΡšΠ΅ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΎΠ³ стринга ΠΊΠ°ΠΊΠΎ бисмо ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌ ΡƒΡ‡ΠΈΠ½ΠΈΠ»ΠΈ Ρ‡ΠΈΡ‚Ρ™ΠΈΠ²ΠΈΠΌ.

Π—Π°Ρ‚ΠΎ ΡˆΡ‚ΠΎ СфикаснС структурС ΠΏΠΎΠ΄Π°Ρ‚Π°ΠΊΠ° Ρ€Π΅Π΄Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° Π·Π°Ρ…Ρ‚Π΅Π²Π°Ρ˜Ρƒ ΠΏΠΎ ΡƒΠΌΠ΅Ρ‚Π°ΡšΡƒ О(Π»ΠΎΠ³(Н)) Π²Ρ€Π΅ΠΌΠ΅, Π°Π»ΠΈ Ρƒ ΠΏΠΎΡ‚ΠΏΡƒΠ½ΠΎΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ стаблу са N оставља присутнС КБНУМКБН-КБНУМКБ Ρ‡Π²ΠΎΡ€ΠΎΠ²Π°, Π° Π₯Π°Ρ„ΠΌΠ°Π½ΠΎΠ²ΠΎ стабло јС ΠΊΠΎΠΌΠΏΠ»Π΅Ρ‚Π½ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎ стабло, Ρ‚Π°Π΄Π° сС Π°Π»Π³ΠΎΡ€ΠΈΡ‚Π°ΠΌ ΡƒΠΊΡ™ΡƒΡ‡ΡƒΡ˜Π΅ О(Нлог(Н)) Π²Ρ€Π΅ΠΌΠ΅, Π³Π΄Π΅ N - Π›ΠΈΠΊΠΎΠ²ΠΈ.

Π˜Π·Π²ΠΎΡ€ΠΈ:

Π΅Π½.Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ°.ΠΎΡ€Π³/Π²ΠΈΠΊΠΈ/Π₯ΡƒΡ„Ρ„ΠΌΠ°Π½_Ρ†ΠΎΠ΄ΠΈΠ½Π³
Π΅Π½.Π²ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠ°.ΠΎΡ€Π³/Π²ΠΈΠΊΠΈ/Π’Π°Ρ€ΠΈΠ°Π±Π»Π΅-Π»Π΅Π½Π³Ρ‚Ρ…_Ρ†ΠΎΠ΄Π΅
Π²Π²Π².ΠΈΠΎΡƒΡ‚ΡƒΠ±Π΅.Ρ†ΠΎΠΌ/Π²Π°Ρ‚Ρ†Ρ…?Π²=5вРПин4ΠΎΠΊΠ¦ΠΎ

Π‘Π°Π·Π½Π°Ρ˜Ρ‚Π΅ вишС ΠΎ курсу.

Π˜Π·Π²ΠΎΡ€: Π²Π²Π².Ρ…Π°Π±Ρ€.Ρ†ΠΎΠΌ

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