Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π€ΡƒΠ½Π΄Π°ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ… Π² DelphiΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 99

Автор Π”ΠΆΡƒΠ»ΠΈΠ°Π½ Π‘Π°ΠΊΠ½Π΅Π»Π»

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

Алгоритм кодирования Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ. Π­Ρ‚ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±Ρ‹Π» ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π΅Π½ Π”Π΅Π²ΠΈΠ΄ΠΎΠΌ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½ΠΎΠΌ (David Huffman) Π² 1952 Π³ΠΎΠ΄Ρƒ ("A method for the Construction of Minimum-Redundancy Codes" ("ΠœΠ΅Ρ‚ΠΎΠ΄ создания ΠΊΠΎΠ΄ΠΎΠ² с минимальной ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒΡŽ")), ΠΈ оказался Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΌ, Ρ‡Π΅ΠΌ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ. Π­Ρ‚ΠΎ обусловлСно Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° матСматичСски Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ создаСт наимСньший ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· символов исходных Π΄Π°Π½Π½Ρ‹Ρ….

Аналогично ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ прСфиксным Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, Π³Π΄Π΅ всС Π΄Π°Π½Π½Ρ‹Π΅ хранятся Π² Π»ΠΈΡΡ‚ΡŒΡΡ…. Но Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся нисходящим, Π½Π° этот Ρ€Π°Π· построСниС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ снизу Π²Π²Π΅Ρ€Ρ…. Π’Π½Π°Ρ‡Π°Π»Π΅ ΠΌΡ‹ выполняСм просмотр Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, подсчитывая количСство появлСний Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π°, ΠΊΠ°ΠΊ это дСлалось ΠΈ ΠΏΡ€ΠΈ использовании Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° частоты появлСния символов Π±ΡƒΠ΄Π΅Ρ‚ создана, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ Π΄Π΅Ρ€Π΅Π²Π°.

Π‘ΡƒΠ΄Π΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ эти ΠΏΠ°Ρ€Ρ‹ символ-количСство "ΠΏΡƒΠ»ΠΎΠΌ" ΡƒΠ·Π»ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°. Π£Π΄Π°Π»ΠΈΠΌ ΠΈΠ· этого ΠΏΡƒΠ»Π° Π΄Π²Π° ΡƒΠ·Π»Π° с наимСньшими значСниями количСства появлСний. ΠŸΡ€ΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΠΌ ΠΈΡ… ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ ΠΈ установим Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Ρ€Π°Π²Π½Ρ‹ΠΌ суммС счСтчиков Π΅Π³ΠΎ Π΄Π²ΡƒΡ… Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΡƒΠ·Π»ΠΎΠ². ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡƒΠ». ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ этот процСсс удалСния Π΄Π²ΡƒΡ… ΡƒΠ·Π»ΠΎΠ² ΠΈ добавлСния вмСсто Π½ΠΈΡ… ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΡƒΠ·Π»Π° Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π² ΠΏΡƒΠ»Π΅ Π½Π΅ останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡƒΠ·Π΅Π». На этом этапС ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ ΠΈΠ· ΠΏΡƒΠ»Π° ΠΎΠ΄ΠΈΠ½ ΡƒΠ·Π΅Π». Он являСтся ΠΊΠΎΡ€Π½Π΅Π²Ρ‹ΠΌ ΡƒΠ·Π»ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°.

ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ процСсс Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ наглядСн, поэтому создадим Π΄Π΅Ρ€Π΅Π²ΠΎ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° для прСдлоТСния "How much wood could a woodchuck chuck?" ΠœΡ‹ ΡƒΠΆΠ΅ вычислили количСство появлСний символов этого прСдлоТСния ΠΈ прСдставили ΠΈΡ… Π² Π²ΠΈΠ΄Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ 11.1, поэтому Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊ Π½Π΅ΠΉ потрСбуСтся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ описанный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ с Ρ†Π΅Π»ΡŒΡŽ построСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°. Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π΄Π²Π° ΡƒΠ·Π»Π° с наимСньшими значСниями. БущСствуСт нСсколько ΡƒΠ·Π»ΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ, Π½ΠΎ ΠΌΡ‹ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΡƒΠ·Π»Ρ‹ "m" ΠΈ Для ΠΎΠ±ΠΎΠΈΡ… этих ΡƒΠ·Π»ΠΎΠ² число появлСний символов Ρ€Π°Π²Π½ΠΎ 1. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π», Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ 2, ΠΈ присоСдиним ΠΊ Π½Π΅ΠΌΡƒ Π΄Π²Π° Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… ΡƒΠ·Π»Π° Π² качСствС Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ…. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡƒΠ». ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Ρ†ΠΈΠΊΠ» с самого Π½Π°Ρ‡Π°Π»Π°. На этот Ρ€Π°Π· ΠΌΡ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ ΡƒΠ·Π»Ρ‹ "Π°" ΠΈ "Π”.", объСдиняСм ΠΈΡ… Π² ΠΌΠΈΠ½ΠΈ-Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ снова Ρ€Π°Π²Π½ΠΎ 2) ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΏΡƒΠ». Π‘Π½ΠΎΠ²Π° ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Ρ†ΠΈΠΊΠ». На этот Ρ€Π°Π· Π² нашСм распоряТСнии имССтся СдинствСнный ΡƒΠ·Π΅Π», Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ 1 (ΡƒΠ·Π΅Π» "Н") ΠΈ Ρ‚Ρ€ΠΈ ΡƒΠ·Π»Π° со значСниями счСтчиков, Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ 2 (ΡƒΠ·Π΅Π» "ΠΊ" ΠΈ Π΄Π²Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΡƒΠ·Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ этим). Π’Ρ‹Π±Π΅Ρ€Π΅ΠΌ ΡƒΠ·Π΅Π» "ΠΊ", присоСдиним Π΅Π³ΠΎ ΠΊ ΡƒΠ·Π»Ρƒ "H" ΠΈ снова Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΏΡƒΠ» Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π», Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Ρ€Π°Π²Π½ΠΎ 3. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€Π΅ΠΌ Π΄Π²Π° Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΡƒΠ·Π»Π° со значСниями счСтчиков, Ρ€Π°Π²Π½Ρ‹ΠΌΠΈ 2, присоСдиним ΠΈΡ… ΠΊ Π½ΠΎΠ²ΠΎΠΌΡƒ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ счСтчика, Ρ€Π°Π²Π½Ρ‹ΠΌ 4, ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ этот Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡƒΠ·Π΅Π» Π² ΠΏΡƒΠ». НСсколько ΠΏΠ΅Ρ€Π²Ρ‹Ρ… шагов построСния Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½Π° рис. 11.2.


Рисунок 11.2. ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° Π₯ΠΎΡ„Ρ„ΠΌΠ°Π½Π°


Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ это Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ, созданноС для кодирования Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· символов Π² исходном ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ 11.5.

Π’Π°Π±Π»ΠΈΡ†Π° 11.5. ΠšΠΎΠ΄Ρ‹ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° для символов ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° прСдлоТСния

Π‘ΠΈΠΌΠ²ΠΎΠ» - ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ появлСний

ΠŸΡ€ΠΎΠ±Π΅Π» - 00

c - 100

o - 101

u - 010

d - 1100

h - 1101

w - 1110

k - 11110

H - 11111

a - 01100

l - 01101

m - 01110

? - 01111


ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ эта Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² - Π½Π΅ СдинствСнная возмоТная. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° имССтся Ρ‚Ρ€ΠΈ ΠΈΠ»ΠΈ большС ΡƒΠ·Π»ΠΎΠ², ΠΈΠ· числа ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π΄Π²Π°, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄Π΅Ρ€Π΅Π²Π° ΠΈ, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠΎΠ΄ΠΎΠ². Но Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ всС эти Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² ΠΈ ΠΊΠΎΠ΄ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ максимальноС сТатиС. ВсС ΠΎΠ½ΠΈ эквивалСнтны.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ для всСго прСдлоТСния. Он начинаСтся с Π±ΠΈΡ‚ΠΎΠ²:

1111110111100001110010100...

ΠΈ содСрТит всСго 131 Π±ΠΈΡ‚. Если Π±Ρ‹ исходноС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΊΠΎΠ΄Π°ΠΌΠΈ ASCII, ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Π±Π°ΠΉΡ‚Ρƒ Π½Π° символ, ΠΎΠ½ΠΎ содСрТало Π±Ρ‹ 286 Π±ΠΈΡ‚ΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС коэффициСнт сТатия составляСт ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 54%.

ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ снова, Ρ‡Ρ‚ΠΎ, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡΠΆΠ°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² состав сТатых Π΄Π°Π½Π½Ρ‹Ρ….

ВосстановлСниС выполняСтся ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ использовании кодирования Π¨Π΅Π½Π½ΠΎΠ½Π°-Π€Π°Π½ΠΎ: Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² сТатом ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ для считывания сТатого ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ².

Рассмотрим ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° с высокоуровнСвой Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния. Π’ Ρ…ΠΎΠ΄Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² сТатия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ описаны Π² этой Π³Π»Π°Π²Π΅, ΠΌΡ‹ создадим ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ°ΠΊ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΈ сТимаСт всС Π΄Π°Π½Π½Ρ‹Π΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π­Ρ‚Π° высокоуровнСвая ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° TDHuffroanCompress, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 11.5.

Листинг 11.5. ВысокоуровнСвая ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° кодирования Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°


procedure TDHuffmanCompress(aInStream, aOutStream : TStream);

var

HTree : THuffmanTree;

HCodes : PHuffmanCodes;

BitStrm : TtdOutputBitStream;

Signature : longint;

Size : longint;

begin

{вывСсти ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° (сигнатуру ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ нСсТатых Π΄Π°Π½Π½Ρ‹Ρ…)}

Signature := TDHuffHeader;

aOutStream.WriteBuffer(Signature, sizeof(longint));

Size := aInStream.Size;

aOutStream.WriteBuffer(Size, sizeof(longint));

{ΠΏΡ€ΠΈ отсутствии Π΄Π°Π½Π½Ρ‹Ρ… для сТатия Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹}

if (Size = 0) then

Exit;

{ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ°}

HTree := nil;

HCodes := nil;

BitStrm := nil;

try

{ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ сТатый ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ²}

BitStrm := TtdOutputBitStream.Create(aOutStream);

BitStrm.Name := 'Huffman compressed stream';

{Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ Π΄Π΅Ρ€Π΅Π²ΠΎ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°}

HTree := THuffmanTree.Create;

{ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ распрСдСлСниС символов Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ восходящСС построСниС Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°}

HTree.CalcCharDistribution(aInStream);

{вывСсти Π΄Π΅Ρ€Π΅Π²ΠΎ Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² для облСгчСния Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ восстановлСния Π΄Π°Π½Π½Ρ‹Ρ…}

HTree.SaveToBitStream (BitStrm);

{Ссли ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° являСтся листом, Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ состоит лишь ΠΈΠ· СдинствСнного ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰Π΅Π³ΠΎΡΡ символа, ΠΈ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π°Π΄Π°Ρ‡Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сТатиС Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°}

if not HTree.RootIsLeaf then begin

{Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ массив ΠΊΠΎΠ΄ΠΎΠ²}

New(HCodes);

{Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ всС ΠΊΠΎΠ΄Ρ‹}

HTree.CalcCodes(HCodes^ );

{ΡΠΆΠ°Ρ‚ΡŒ символы Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ²}

DoHuffmanCompression(aInStream, BitStrm, HCodes^ );

end;

finally

BitStrm.Free;

HTree.Free;

if (HCodes <> nil) then

Dispose(HCodes);

end;

end;


Код содСрТит мноТСство элСмСнтов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ рассматривали. Но ΠΌΡ‹ Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π½Π°Ρ‡Π°Π»Π΅ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ†Π΅Π»ΠΎΠΌ, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ этапа. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, ΠΌΡ‹ записываСм Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ нСбольшой Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Ρ‹ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. ВпослСдствии эта информация упростит Π·Π°Π΄Π°Ρ‡Ρƒ восстановлСния Π΄Π°Π½Π½Ρ‹Ρ…, гарантируя, Ρ‡Ρ‚ΠΎ сТатый ΠΏΠΎΡ‚ΠΎΠΊ соотвСтствуСт созданному Π½Π°ΠΌΠΈ. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ создаСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π±ΠΈΡ‚ΠΎΠ², содСрТащий Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг -созданиС экзСмпляра класса THuffmanTree. Π­Ρ‚ΠΎΡ‚ класс, ΠΊΠ°ΠΊ вскорС Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° ΠΈ содСрТит Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‰ΠΈΠ΅ Π² Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ этой Π·Π°Π΄Π°Ρ‡ΠΈ. Один ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² этого Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΌΠ΅Ρ‚ΠΎΠ΄ CalcCharDistribution, опрСдСляСт ΡΡ‚Π°Ρ‚ΠΈΡΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ распрСдСлСния символов Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ строит прСфиксноС Π΄Π΅Ρ€Π΅Π²ΠΎ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°.

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π΄Π΅Ρ€Π΅Π²ΠΎ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° построСно, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ SaveToBitStream, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ структуру Π΄Π΅Ρ€Π΅Π²Π° Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ выполняСм ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ особого случая ΠΈ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ. Если Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ состоит всСго лишь ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ символа, ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ ΡƒΠ·Π΅Π» Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° Π±ΡƒΠ΄Π΅Ρ‚ листом. ВсС прСфиксноС Π΄Π΅Ρ€Π΅Π²ΠΎ состоит всСго ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°. Π’ этом случаС Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΡƒΠΆΠ΅ достаточно ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° восстановлСния ΠΌΠΎΠ³Π»Π° Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходный Ρ„Π°ΠΉΠ» (ΠΌΡ‹ ΡƒΠΆΠ΅ записали Π² ΠΏΠΎΡ‚ΠΎΠΊ Π±ΠΈΡ‚ΠΎΠ² Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ СдинствСнный Π±ΠΈΡ‚).

Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ, ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅, Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… символа, ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π° Π½Π΅ СдинствСнного ΡƒΠ·Π»Π°. Π’ этом случаС ΠΌΡ‹ выполняСм ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ: вычисляСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа, Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅. Π­Ρ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ врСмя Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ этапС, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ сТатиС, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½Π΅ придСтся постоянно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ для выполнСния кодирования ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа. Массив HCodes - простой 256-элСмСнтный массив, содСрТащий ΠΊΠΎΠ΄Ρ‹ всСх символов ΠΈ построСнный посрСдством Π²Ρ‹Π·ΠΎΠ²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π° CalcCodes ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄Π΅Ρ€Π΅Π²Π° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π°.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΊΠΎΠ³Π΄Π° всС эти структуры Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ DoHuffmanCompression, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΡƒΡŽ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ сТатиС Π΄Π°Π½Π½Ρ‹Ρ…. Код этой ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 11.6.