ΠΠΎ ΠΏΡΠ΅ΡΡΠ΅Ρ Π½Π° ΠΏΠΎΡΠ΅ΡΠΎΠΊΠΎΡ Π½Π° ΠΊΡΡΡΠΎΡ
ΠΠΎΠ΄ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° Π₯Π°ΡΠΌΠ°Π½ Π΅ Π°Π»Π³ΠΎΡΠΈΡΠ°ΠΌ Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠΎ ΡΠ° ΡΠΎΡΠΌΡΠ»ΠΈΡΠ° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π·Π° ΠΊΠΎΠΌΠΏΡΠ΅ΡΠΈΡΠ° Π½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠΈ. ΠΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ Π·Π±ΠΎΡΡΠ²Π°ΠΌΠ΅ Π·Π° ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ ΡΠΎ ΡΠΈΠΊΡΠ½Π° ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°, ΡΠ½ΠΈΠΊΠ°ΡΠ½ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠΊΠΈ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ, ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΠΏΡΠ΅ΡΠΈΠΊΡ ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡΠ° Π½Π° Π΄ΡΠ²ΠΎΡΠΎ Π₯Π°ΡΠΌΠ°Π½.
ΠΠ½Π°Π΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ΠΊΠΎΡ Π·Π½Π°ΠΊ Π΅ Π·Π°ΡΡΠ²Π°Π½ ΠΊΠ°ΠΊΠΎ Π½ΠΈΠ·Π° ΠΎΠ΄ 0 ΠΈ 1 ΠΈ Π·Π°ΡΠ°ΡΠ° 8 Π±ΠΈΡΠ°. ΠΠ²Π° ΡΠ΅ Π½Π°ΡΠ΅ΠΊΡΠ²Π° ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ ΡΠΎ ΡΠΈΠΊΡΠ½Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π° Π±ΠΈΠ΄Π΅ΡΡΠΈ ΡΠ΅ΠΊΠΎΡ Π·Π½Π°ΠΊ ΠΊΠΎΡΠΈΡΡΠΈ ΠΈΡΡ ΡΠΈΠΊΡΠ΅Π½ Π±ΡΠΎΡ Π½Π° Π±ΠΈΡΠΎΠ²ΠΈ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅.
ΠΠ° ΡΠ΅ΡΠ΅ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΡΠ΅ΠΊΡΡΠΎΡ Π΅ Π΄Π°Π΄Π΅Π½. ΠΠ°ΠΊΠΎ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΠΌΠ΅ ΠΏΡΠΎΡΡΠΎΡΠΎΡ ΠΏΠΎΡΡΠ΅Π±Π΅Π½ Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π½Π° Π΅Π΄Π΅Π½ Π·Π½Π°ΠΊ?
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΈΠ΄Π΅ΡΠ° Π΅ ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅ ΡΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°. ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΈΡΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΡΠ°ΠΊΡΠΎΡ Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠΈ Π·Π½Π°ΡΠΈ ΡΠ΅ ΠΏΠΎΡΠ°Π²ΡΠ²Π°Π°Ρ ΠΏΠΎΡΠ΅ΡΡΠΎ Π²ΠΎ ΡΠ΅ΠΊΡΡΠΎΡ ΠΎΠ΄ Π΄ΡΡΠ³ΠΈΡΠ΅ (
ΠΠ°ΠΊΠΎ, Π·Π½Π°Π΅ΡΡΠΈ Π½ΠΈΠ·Π° ΠΎΠ΄ Π±ΠΈΡΠΎΠ²ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π΅Π΄Π²ΠΎΡΠΌΠΈΡΠ»Π΅Π½ΠΎ Π΄Π° ΡΠ° Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°ΡΠ΅?
Π Π°Π·ΠΌΠΈΡΠ»Π΅ΡΠ΅ Π·Π° Π»ΠΈΠ½ΠΈΡΠ°ΡΠ° "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 Π²Π½Π°ΡΡΠ΅ΡΠ½ΠΈ ΡΠ°Π·Π»ΠΈ. Π‘Π΅ ΠΏΡΠ΅ΠΏΠΎΡΠ°ΡΡΠ²Π° ΠΊΠΎΠ³Π° ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ° Π΄ΡΠ²ΠΎ Π₯Π°ΡΠΌΠ°Π½, Π½Π΅ΠΈΡΠΊΠΎΡΠΈΡΡΠ΅Π½ΠΈΡΠ΅ ΡΠΈΠΌΠ±ΠΎΠ»ΠΈ Π΄Π° ΡΠ΅ ΠΎΡΡΡΠ»Π°Ρ Π·Π° Π΄Π° ΡΠ΅ Π΄ΠΎΠ±ΠΈΡΠ°Ρ ΠΊΠΎΠ΄ΠΎΠ²ΠΈ ΡΠΎ ΠΎΠΏΡΠΈΠΌΠ°Π»Π½Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°.
ΠΠ΅ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½Π° ΡΠ΅Π΄ΠΈΡΠ° Π·Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ Π₯Π°ΡΠΌΠ°Π½ Π΄ΡΠ²ΠΎ, ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π½Π° ΡΠ°Π·ΠΎΠ»ΠΎΡ ΡΠΎ Π½Π°ΡΠ½ΠΈΡΠΊΠ° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ° ΡΠ΅ ΠΌΡ ΡΠ΅ Π΄Π°Π΄Π΅ Π½Π°ΡΠ³ΠΎΠ»Π΅ΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ. ΠΠΎΠ΄ΠΎΠ»Ρ ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈ ΡΠ΅ΠΊΠΎΡΠΈΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°Π΄Π±Π°:
- ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π»ΠΈΡΡ ΡΠ°Π·ΠΎΠ» Π·Π° ΡΠ΅ΠΊΠΎΡ ΡΠΈΠΌΠ±ΠΎΠ» ΠΈ Π΄ΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π³ΠΈ Π²ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½Π°ΡΠ° ΡΠ΅Π΄ΠΈΡΠ°.
- ΠΠΎΠ΄Π΅ΠΊΠ° ΠΈΠΌΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ Π΅Π΄Π΅Π½ Π»ΠΈΡΡ Π²ΠΎ ΡΠ΅Π΄ΠΎΡ, Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΡΠ»Π΅Π΄Π½ΠΎΠ²ΠΎ:
- ΠΡΡΡΡΠ°Π½Π΅ΡΠ΅ Π³ΠΈ Π΄Π²Π°ΡΠ° ΡΠ°Π·Π»ΠΈ ΡΠΎ Π½Π°ΡΠ²ΠΈΡΠΎΠΊ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ (Π½Π°ΡΠ½ΠΈΡΠΊΠ° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°) ΠΎΠ΄ ΡΠ΅Π΄ΠΎΡ;
- ΠΠ°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π½ΠΎΠ² Π²Π½Π°ΡΡΠ΅ΡΠ΅Π½ ΡΠ°Π·ΠΎΠ», ΠΊΠ°Π΄Π΅ ΡΡΠΎ ΠΎΠ²ΠΈΠ΅ Π΄Π²Π° ΡΠ°Π·Π»ΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΡΠΈ, Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΏΠΎΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΅Π΄Π½Π°ΠΊΠ²Π° Π½Π° Π·Π±ΠΈΡΠΎΡ Π½Π° ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΠΈΡΠ΅ Π½Π° ΠΎΠ²ΠΈΠ΅ Π΄Π²Π° ΡΠ°Π·Π»ΠΈ.
- ΠΠΎΠ΄Π°Π΄Π΅ΡΠ΅ Π½ΠΎΠ² ΡΠ°Π·ΠΎΠ» Π²ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½Π°ΡΠ° ΡΠ΅Π΄ΠΈΡΠ°.
- ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΠΎΡ ΠΏΡΠ΅ΠΎΡΡΠ°Π½Π°Ρ ΡΠ°Π·ΠΎΠ» ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΊΠΎΡΠ΅Π½ΡΠΊΠΈΠΎΡ ΡΠ°Π·ΠΎΠ» ΠΈ ΠΎΠ²Π° ΡΠ΅ ΡΠ° Π·Π°Π²ΡΡΠΈ ΠΈΠ·Π³ΡΠ°Π΄Π±Π°ΡΠ° Π½Π° Π΄ΡΠ²ΠΎΡΠΎ.
ΠΠ° Π·Π°ΠΌΠΈΡΠ»ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠΌΠ°ΠΌΠ΅ Π½Π΅ΠΊΠΎΡ ΡΠ΅ΠΊΡΡ ΠΊΠΎΡ ΡΠ΅ ΡΠΎΡΡΠΎΠΈ ΡΠ°ΠΌΠΎ ΠΎΠ΄ Π·Π½Π°ΡΠΈ "Π° Π±Π΅ ΡΠ΅ Π΄Π΅" ΠΈ βΠΈβ, Π° Π½ΠΈΠ²Π½ΠΈΡΠ΅ ΡΡΠ΅ΠΊΠ²Π΅Π½ΡΠΈΠΈ Π½Π° ΠΏΠΎΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΡΠ΅ 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 - ΠΠΈΠΊΠΎΠ²ΠΈ.
ΠΠ·Π²ΠΎΡΠΈ:
ΠΠ·Π²ΠΎΡ: www.habr.com