ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Delphi. 
НСмного ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Π Π΅Ρ„Π΅Ρ€Π°Ρ‚ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Π˜Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ ΠΈΠ· 256 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚. Из ΡΡ‚ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ лишь 2 ΠΏΠΎ Π΄Π»ΠΈΠ½Π½Π΅ Ρ€Π°Π²Π½Ρ‹ 8 Π±ΠΈΡ‚Π°ΠΌ. Если ΠΌΡ‹ ΡΠ»ΠΎΠΆΠΈΠΌ число Π±ΠΈΡ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ это прСдставляСт, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 1554 Π±ΠΈΡ‚ ΠΈΠ»ΠΈ 195 Π±Π°ΠΉΡ‚ΠΎΠ². Π’Π°ΠΊ Π² ΠΌΠ°ΠΊΡΠΈΠΌΡƒΠΌΠ΅, ΠΌΡ‹ ΡΠΆΠ°Π»ΠΈ 256 Π±Π°ΠΉΡ‚ ΠΊ 195 ΠΈΠ»ΠΈ 33%, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ максимально ΠΈΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Huffman ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ сТатия Π² 33% ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°ΠΉΡ‚Π° ВсС эти… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Delphi. НСмного ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ… (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

Delphi. НСмного ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…

Running — Π­Ρ‚ΠΎ самый простой ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅ Ρ‡Ρ‚ΠΎ Π’Ρ‹ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ строку тСкста, ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ строки стоит 40 ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ². Налицо явная ΠΈΠ·Π±Ρ‹Ρ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΉΡΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° сТатия этой строки Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ просто — эти 40 ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² (40 Π±Π°ΠΉΡ‚) ΡΠΆΠΈΠΌΠ°ΡŽΡ‚ΡΡ Π² 3 Π±Π°ΠΉΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΠΈ ΠΈΡ… ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΡ…ΡΡ символов (running). ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π±Π°ΠΉΡ‚, стоящий вмСсто 40 ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² Π² ΡΠΆΠ°Ρ‚ΠΎΠΉ строкС, фактичСски Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ²Π»Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° ΠΈΠ· ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²). Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°ΠΉΡ‚ — ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π°ΠΉΡ‚ «Ρ„Π»Π°ΠΆΠΊΠ° «ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅ Π±Π°ΠΉΡ‚ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ восстановлСнии строки. Π’Ρ€Π΅Ρ‚ΠΈΠΉ Π±Π°ΠΉΡ‚ — Π±Π°ΠΉΡ‚ счСта (Π² Π½Π°ΡˆΠ΅ΠΌ случаС это Π±ΡƒΠ΄Π΅Ρ‚ 40). Как Π’Ρ‹ ΡΠ°ΠΌΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, достаточно Ρ‡Ρ‚ΠΎΠ±Ρ‹ любой Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· Π±ΠΎΠ»Π΅Π΅ 3-Ρ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов, Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… Π²Ρ‹ΡˆΠ΅ описанной ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ мСньший ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Π½ΠΎ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‰ΠΈΠΉ восстановлСниС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅.

ΠžΡΡ‚Π°Π²Π»ΡΡ всС сказанноС Π²Ρ‹ΡˆΠ΅ истинным, добавлю лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ основной ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ являСтся Π²Ρ‹Π±ΠΎΡ€ Ρ‚ΠΎΠ³ΠΎ самого Π±Π°ΠΉΡ‚Π° «Ρ„Π»Π°ΠΆΠΊΠ° », Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠ°Ρ… ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ всС 256 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π±Π°ΠΉΡ‚Π° ΠΈ Π½Π΅Ρ‚ возмоТности ΠΈΠΌΠ΅Ρ‚ΡŒ 257 Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ — «Ρ„Π»Π°ΠΆΠΎΠΊ ». На ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° каТСтся Π½Π΅Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠΌΠΎΠΉ, Π½ΠΎ ΠΊ Π½Π΅ΠΉ Π΅ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π’Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° (Huffman).

LZW — Π˜ΡΡ‚ΠΎΡ€ΠΈΡ этого Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° начинаСтся с ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΈΡ Π² ΠΌΠ°Π΅ 1977 Π³. Π”ΠΆ. Π—ΠΈΠ²ΠΎΠΌ (J. Ziv) ΠΈ А. Π›Π΅ΠΌΠΏΠ΅Π»Π΅ΠΌ (A. Lempel) ΡΡ‚Π°Ρ‚ΡŒΠΈ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ «Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ «ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ «IEEE Trans ». Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡΡ‚Π²ΠΈΠΈ этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π±Ρ‹Π» Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½ Π’Π΅Ρ€Ρ€ΠΈ А. Π’Π΅Π»Ρ‡Π΅ΠΌ (Terry A. Welch) ΠΈ Π² ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ Π² ΡΡ‚Π°Ρ‚ΡŒΠ΅ «IEEE Compute «Π² ΠΈΡŽΠ½Π΅ 1984. Π’ ΡΡ‚ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΈΡΡŒ подробности Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Ρ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. ПозТС этот Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π½Π°Π·Π²Π°Π½ΠΈΠ΅ — LZW (Lempel — Ziv — Welch) .

Алгоритм LZW прСдставляСт собой Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ кодирования ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ Π½Π΅ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° строку «ΠžΠ±ΡŠΠ΅ΠΊΡ‚ TSortedCollection ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ ΠΎΡ‚ TCollection. ». Анализируя эту строку ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ слово «Collection «ΠΏΠΎΠ²Ρ‚оряСтся Π΄Π²Π°ΠΆΠ΄Ρ‹. Π’ ΡΡ‚ΠΎΠΌ словС 10 символов — 80 Π±ΠΈΡ‚. И Π΅ΡΠ»ΠΈ ΠΌΡ‹ ΡΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ это слово Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ, Π½Π° ΡΡΡ‹Π»ΠΊΡƒ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сТатиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. Если Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±Π»ΠΎΠΊ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 64К ΠΈ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ся Π΄Π»ΠΈΠ½Π½ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ строки Π² 256 символов, Ρ‚ΠΎ ΡƒΡ‡ΠΈΡ‚ывая Π±Π°ΠΉΡ‚ «Ρ„Π»Π°Π³ «ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, Ρ‡Ρ‚ΠΎ строка ΠΈΠ· 80 Π±ΠΈΡ‚ замСняСтся 8+16+8 = 32 Π±ΠΈΡ‚Π°. Алгоритм LZW ΠΊΠ°ΠΊ-Π±Ρ‹ «ΠΎΠ±ΡƒΡ‡Π°Π΅Ρ‚ся «Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ сТатия Ρ„Π°ΠΉΠ»Π°. Если ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ΡΡ строки Π² Ρ„Π°ΠΉΠ»Π΅, Ρ‚ΠΎ ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ прСимущСством Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚ нСобходимости Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ Π² ΡΠΆΠ°Ρ‚Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π”Ρ€ΡƒΠ³ΠΎΠΉ Π²Π°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сТатиС ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ LZW являСтся ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° (Huffman), ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ трСбуСтся Π΄Π²Π° ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π°.

Huffman — Π‘Π½Π°Ρ‡Π°Π»Π° каТСтся Ρ‡Ρ‚ΠΎ созданиС Ρ„Π°ΠΉΠ»Π° ΠΌΠ΅Π½ΡŒΡˆΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈΠ· ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π΅Π· ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ ΠΈΠ»ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π° Π±Π°ΠΉΡ‚ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ. Но Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΌΡ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΠΌ сСбя ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСсколько умствСнных усилий ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° (Huffman). ΠŸΠΎΡ‚Π΅Ρ€ΡΠ² Π½Π΅ Ρ‚Π°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΌΡ‹ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π΅ΠΌ знания ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ мСсто Π½Π° Π΄ΠΈΡΠΊΠ°Ρ….

БТимая Ρ„Π°ΠΉΠ» ΠΏΠΎ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ — это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ сколько Ρ€Π°Π· встрСчаСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡ€Π° ASCII. Если ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС 256 символов, Ρ‚ΠΎ Π΄Π»Ρ нас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ Π² ΡΠΆΠ°Ρ‚ΠΈΠΈ тСкстового ΠΈ EXE Ρ„Π°ΠΉΠ»Π°.

ПослС подсчСта частоты вхоТдСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² ASCII ΠΈ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΈΠΌΡƒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠ΄Π°ΠΌΠΈ ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½Π΅ ΠΌΠ΅Π½ΡΡ мСстонахоТдСниС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ ΠΎΡ‚ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ссылок Π½Π° Π½ΠΈΡ… ΠΏΠΎ ΡƒΠ±Ρ‹Π²Π°Π½ΠΈΡŽ. ΠšΠ°ΠΆΠ΄ΡƒΡŽ ссылку ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π½Π°Π·ΠΎΠ²Π΅ΠΌ «ΡƒΠ·Π»ΠΎΠΌ ». Π’ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ (Π² Π΄Π΅Ρ€Π΅Π²Π΅) ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ·ΠΆΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΡΡ‚ΠΎΡ‚ «ΡƒΠ·Π΅Π» ». Для ясности Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ΠœΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Ρ„Π°ΠΉΠ» Π΄Π»ΠΈΠ½Π½ΠΎΠΉ Π² 100 Π±Π°ΠΉΡ‚ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ 6 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… символов Π² ΡΠ΅Π±Π΅. ΠœΡ‹ ΠΏΠΎΠ΄ΡΡ‡ΠΈΡ‚Π°Π»ΠΈ Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π² Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ :

+————————-+——-+——-+——-+——-+——-+——-+.

| cΠΈΠΌΠ²ΠΎΠ» | A | B | C | D | E | F |.

+————————-+——-+——-+——-+——-+——-+——-|.

| число Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ | 10 | 20 | 30 | 5 | 25 | 10 |.

+————————-+——-+——-+——-+——-+——-+——-+.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ Π±Π΅Ρ€Π΅ΠΌ эти числа ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π½Π°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… Ρ‡Π°ΡΡ‚ΠΎΡ‚ΠΎΠΉ вхоТдСния для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа. РазмСстим Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠ°ΠΊ Π½ΠΈΠΆΠ΅.

+————————-+——-+——-+——-+——-+——-+——-+.

| cΠΈΠΌΠ²ΠΎΠ» | C | E | B | F | A | D |.

+————————-+——-+——-+——-+——-+——-+——-|.

| число Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ | 30 | 25 | 20 | 10 | 10 | 5 |.

+————————-+——-+——-+——-+——-+——-+——-+.

ΠœΡ‹ Π²ΠΎΠ·ΡŒΠΌΠ΅ΠΌ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символы с Π½Π°ΠΈΠΌΠ΅Π½ΡŒΡˆΠ΅ΠΉ частотой. Π’ Π½Π°ΡˆΠ΅ΠΌ случаС это D (5) ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ символ ΠΈΠ· F ΠΈΠ»ΠΈ A (10), ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ любой ΠΈΠ· Π½ΠΈΡ… Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ A. Π‘Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΈΠ· «ΡƒΠ·Π»ΠΎΠ² «D ΠΈ A Π½ΠΎΠ²Ρ‹ΠΉ «ΡƒΠ·Π΅Π» », частота вхоТдСния для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π²Π½Π° суммС частот D ΠΈ A :

Частота 30 10 5 10 20 25.

Π‘ΠΈΠΌΠ²ΠΎΠ»Π° C A D F B E.

| |.

+—+—+.

+±+.

|15| = 5 + 10.

+—+.

НомСр Π² Ρ€Π°ΠΌΠΊΠ΅ — сумма частот символов D ΠΈ A. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡΠ½ΠΎΠ²Π° ΠΈΡ‰Π΅ΠΌ Π΄Π²Π° символа с ΡΠ°ΠΌΡ‹ΠΌΠΈ Π½ΠΈΠ·ΠΊΠΈΠΌΠΈ частотами вхоТдСния. Π˜ΡΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΠ· ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π° D ΠΈ A ΠΈ Ρ€Π°ΡΡΠΌΠ°Ρ‚ривая вмСсто Π½ΠΈΡ… Π½ΠΎΠ²Ρ‹ΠΉ «ΡƒΠ·Π΅Π» «Ρ ΡΡƒΠΌΠΌΠ°Ρ€Π½ΠΎΠΉ частотой вхоТдСния. Бамая низкая частота Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ F ΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ «ΡƒΠ·Π»Π° ». Π‘Π½ΠΎΠ²Π° сдСлаСм ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ слияния ΡƒΠ·Π»ΠΎΠ² :

Частота 30 10 5 10 20 25.

Π‘ΠΈΠΌΠ²ΠΎΠ»Π° C A D F B E.

| | |.

| | |.

| +—+| |.

±|15++ |.

+±+ |.

| |.

| +—+ |.

+——|25±+ = 10 + 15.

+—+.

РассматриваСм Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ снова для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π΄Π²ΡƒΡ… символов (B ΠΈ E). ΠœΡ‹ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π² ΡΡ‚ΠΎΡ‚ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠΎΠΊΠ° всС «Π΄Π΅Ρ€Π΅Π²ΠΎ «Π½Π΅ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΎ, Ρ‚. Π΅. ΠΏΠΎΠΊΠ° всС Π½Π΅ ΡΠ²Π΅Π΄Π΅Ρ‚ся ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΡƒΠ·Π»Ρƒ.

Частота 30 10 5 10 20 25.

Π‘ΠΈΠΌΠ²ΠΎΠ»Π° C A D F B E.

| | | | | |.

| | | | | |.

| | +—+| | | |.

| ±|15++ | | |.

| +±+ | | |.

| | | | |.

| | +—+ | | +—+ |.

| +——|25±+ ±|45±+.

| +±+ +±+.

| +—+ | |.

+——|55+———+ |.

±++ |.

| +——————+ |.

+—-| Root (100) +——+.

+——————+.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠ³Π΄Π° нашС Π΄Π΅Ρ€Π΅Π²ΠΎ создано, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ». ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ всСгда Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ€Π½Ρ (Root). ΠšΠΎΠ΄ΠΈΡ€ΡƒΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ (лист Π΄Π΅Ρ€Π΅Π²Π° Π‘) ΠœΡ‹ ΠΏΡ€ΠΎΡΠ»Π΅ΠΆΠΈΠ²Π°Π΅ΠΌ Π²Π²Π΅Ρ€Ρ… ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ всС ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Ρ‹ Π²Π΅Ρ‚Π²Π΅ΠΉ ΠΈ Π΅ΡΠ»ΠΈ ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Π»Π΅Π²Ρ‹ΠΉ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚, Ρ‚ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ 0-ΠΉ Π±ΠΈΡ‚, ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ 1-ΠΉ Π±ΠΈΡ‚ для ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°. Π’Π°ΠΊ для C, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ΄Ρ‚ΠΈ Π²Π»Π΅Π²ΠΎ ΠΊ 55 (ΠΈ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠΌ 0), Π·Π°Ρ‚Π΅ΠΌ снова Π²Π»Π΅Π²ΠΎ (0) ΠΊ ΡΠ°ΠΌΠΎΠΌΡƒ символу. Код Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° для нашСго символа C — 00. Для ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ символа (А) Ρƒ Π½Π°Ρ получаСтся — Π»Π΅Π²ΠΎ, ΠΏΡ€Π°Π²ΠΎ, Π»Π΅Π²ΠΎ, Π»Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎ выливаСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ 0100. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π²Ρ‹ΡˆΠ΅ сказанноС для всСх символов ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ.

C = 00 (2 Π±ΠΈΡ‚Π°).

A = 0100 (4 Π±ΠΈΡ‚Π°).

D = 0101 (4 Π±ΠΈΡ‚Π°).

F = 011 (3 Π±ΠΈΡ‚Π°).

B = 10 (2 Π±ΠΈΡ‚Π°).

E = 11 (2 Π±ΠΈΡ‚Π°).

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ символ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ прСдставлялся 8-ю Π±ΠΈΡ‚Π°ΠΌΠΈ (ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚), ΠΈ Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ число Π±ΠΈΡ‚ΠΎΠ² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… для прСдставлСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа, ΠΌΡ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ складывСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ :

+—————+————————+—————————-+———————+.

| Частота | ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ | ΡƒΠΏΠ»ΠΎΡ‚Π½Π΅Π½Π½Ρ‹Π΅ Π±ΠΈΡ‚Ρ‹ | ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΎ Π½Π° |.

+—————+————————+—————————-+———————|.

| C 30 | 30×8 = 240 | 30×2 = 60 | 180 |.

| A 10 | 10×8 = 80 | 10×3 = 30 | 50 |.

| D 5 | 5×8 = 40 | 5×4 = 20 | 20 |.

| F 10 | 10×8 = 80 | 10×4 = 40 | 40 |.

| B 20 | 20×8 = 160 | 20×2 = 40 | 120 |.

| E 25 | 25×8 = 200 | 25×2 = 50 | 150 |.

+—————+————————+—————————-+———————+.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°: 100 Π±Π°ΠΉΡ‚ — 800 Π±ΠΈΡ‚;

Π Π°Π·ΠΌΠ΅Ρ€ сТатого Ρ„Π°ΠΉΠ»Π°: 30 Π±Π°ΠΉΡ‚ — 240 Π±ΠΈΡ‚;

240 — 30% ΠΈΠ· 800, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡΠΆΠ°Π»ΠΈ этот Ρ„Π°ΠΉΠ» Π½Π° 70%.

ВсС это довольно Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ Π½Π΅ΠΏΡ€ΠΈΡΡ‚Π½ΠΎΡΡ‚ΡŒ находится Π² Ρ‚ΠΎΠΌ Ρ„Π°ΠΊΡ‚Π΅, Ρ‡Ρ‚ΠΎ для восстановлСния ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽΡ‰Π΅Π΅ Π΄Π΅Ρ€Π΅Π²ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΄Π΅Ρ€Π΅Π²ΡŒΡ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ для Ρ€Π°Π·Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ вмСстС с Ρ„Π°ΠΉΠ»ΠΎΠΌ. Π­Ρ‚ΠΎ прСвращаСтся Π² ΠΈΡ‚ΠΎΠ³Π΅ Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° .

Π’ Π½Π°ΡˆΠ΅ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊΠ΅ сТатия ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡƒΠ·Π»Π΅ находятся 4 Π±Π°ΠΉΡ‚Π° указатСля, ΠΏΠΎ ΡΡ‚ΠΎΠΌΡƒ, полная Ρ‚Π°Π±Π»ΠΈΡ†Π° для 256 Π±Π°ΠΉΡ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 1 ΠšΠ±Π°ΠΉΡ‚ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ. Π’Π°Π±Π»ΠΈΡ†Π° Π² Π½Π°ΡˆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ 5 ΡƒΠ·Π»ΠΎΠ² плюс 6 Π²Π΅Ρ€ΡˆΠΈΠ½ (Π³Π΄Π΅ ΠΈ Π½Π°Ρ…одятся наши символы), всСго 11. 4 Π±Π°ΠΉΡ‚Π° 11 Ρ€Π°Π· — 44. Если ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ послС нСбольшоС количСство Π±Π°ΠΉΡ‚ΠΎΠ² для сохранСния мСста ΡƒΠ·Π»Π° ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π΄Ρ€ΡƒΠ³ΡƒΡŽ статистику — наша Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 50 Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π»ΠΈΠ½Π½Ρ‹. Π”ΠΎΠ±Π°Π²ΠΈΠ² ΠΊ 30 Π±Π°ΠΉΡ‚Π°ΠΌ сТатой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, 50 Π±Π°ΠΉΡ‚ΠΎΠ² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ общая Π΄Π»ΠΈΠ½Π½Π° Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° вырастСт Π΄ΠΎ 80 Π±Π°ΠΉΡ‚. Учитывая, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ Π΄Π»ΠΈΠ½Π½Π° Ρ„Π°ΠΉΠ»Π° Π² Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±Ρ‹Π»Π° 100 Π±Π°ΠΉΡ‚ — ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ 20% сТатиС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ. НС ΠΏΠ»ΠΎΡ…ΠΎ. Π’ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»ΠΈ — трансляция символьного ASCII Π½Π°Π±ΠΎΡ€Π° Π² Π½Π°Ρˆ Π½ΠΎΠ²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ мСньшСС количСство Π·Π½Π°ΠΊΠΎΠ² ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ.

Π§Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π° ΡΡ‚ΠΎΠΌ ΠΏΡƒΡ‚ΠΈ ?

Рассмотрим максимум ΠΊΠΎΡ‚ΠΎΡ€ΠΉ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… разрядных ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΉ Π² ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ являСтся нСсиммСтричным.

ΠœΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ :

4 — 2 разрядных ΠΊΠΎΠ΄Π°;

8 — 3 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

16 — 4 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

32 — 5 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

64 — 6 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

128 — 7 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

НСобходимо Π΅Ρ‰Π΅ Π΄Π²Π° 8 разрядных ΠΊΠΎΠ΄Π°.

4 — 2 разрядных ΠΊΠΎΠ΄Π°;

8 — 3 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

16 — 4 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

32 — 5 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

64 — 6 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

128 — 7 разрядных ΠΊΠΎΠ΄ΠΎΠ²;

———-;

Π˜Ρ‚Π°ΠΊ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΈΡ‚ΠΎΠ³ ΠΈΠ· 256 Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚. Из ΡΡ‚ΠΈΡ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ лишь 2 ΠΏΠΎ Π΄Π»ΠΈΠ½Π½Π΅ Ρ€Π°Π²Π½Ρ‹ 8 Π±ΠΈΡ‚Π°ΠΌ. Если ΠΌΡ‹ ΡΠ»ΠΎΠΆΠΈΠΌ число Π±ΠΈΡ‚ΠΎΠ² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ это прСдставляСт, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ 1554 Π±ΠΈΡ‚ ΠΈΠ»ΠΈ 195 Π±Π°ΠΉΡ‚ΠΎΠ². Π’Π°ΠΊ Π² ΠΌΠ°ΠΊΡΠΈΠΌΡƒΠΌΠ΅, ΠΌΡ‹ ΡΠΆΠ°Π»ΠΈ 256 Π±Π°ΠΉΡ‚ ΠΊ 195 ΠΈΠ»ΠΈ 33%, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ максимально ΠΈΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Huffman ΠΌΠΎΠΆΠ΅Ρ‚ Π΄ΠΎΡΡ‚ΠΈΠ³Π°Ρ‚ΡŒ сТатия Π² 33% ΠΊΠΎΠ³Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Π±Π°ΠΉΡ‚Π° ВсС эти подсчСты ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ для Π½Π΅ ΠΏΡ€Π΅Ρ„иксных ΠΊΠΎΠ΄ΠΎΠ² Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° Ρ‚. Π΅. ΠΊΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСльзя ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎ. НапримСр ΠΊΠΎΠ΄ A — 1 011 ΠΈ ΠΊΠΎΠ΄ B — 0101. Если ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ эти ΠΊΠΎΠ΄Ρ‹ ΠΏΠΎΠ±ΠΈΡ‚Π½ΠΎ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² Π±ΠΈΡ‚Ρ‹ 0101 ΠΌΡ‹ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ A ΠΈΠ»ΠΈ B, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π±ΠΈΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π°Ρ‡Π°Π»ΠΎΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.

НСобходимо Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ»ΡŽΡ‡Π΅ΠΌ ΠΊ ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΡŽ прСфиксных ΠΊΠΎΠ΄ΠΎΠ² слуТит ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΈ Π΅ΡΠ»ΠΈ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΏΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π΅Ρ€Π΅Π²Π°, ΠΌΠΎΠΆΠ½ΠΎ убСдится, Ρ‡Ρ‚ΠΎ всС ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹Π΅ ΠΊΠΎΠ΄Ρ‹ Ρ‚Π°ΠΌ прСфиксныС.

Одно послСднСС ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ — Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Π₯Π°Ρ„Ρ„ΠΌΠ°Π½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» Π΄Π²Π°ΠΆΠ΄Ρ‹, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· считая частоты вхоТдСния символов, Π΄Ρ€ΡƒΠ³ΠΎΠΉ разпроизводя нСпосрСдствСнно ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅.

P. S. О «ΠΊΠ»ΡŽΡ‡ΠΈΠΊΠ΅ «Π΄Π°ΡŽΡ‰Π΅ΠΌ Π΄ΠΎΡ€ΠΎΠ³Ρƒ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡƒ Running.

—— ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² ΠΎΠ±Π·ΠΎΡ€Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Huffman ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅Π½Π°Π΄ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΌ Π΄Π΅Ρ€Π΅Π²Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ 257 листиков.

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

1) ОписаниС Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€Π° Narc Ρ„ΠΈΡ€ΠΌΡ‹ Infinity Design Concepts, Inc.;

2) Π§Π°Ρ€Π»ΡŒΠ· Π‘Π΅ΠΉΡ‚Π΅Ρ€, «Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… », «ΠœΠΈΡ€ ПК », N2 1991;

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

{$A+, B-, D+, E+, F-, G-, I-, L+, N-, O-, R+, S+, V+, X-}.

{$M 16 384,0,655 360}.

{******************************************************}.

{* Алгоритм уплотнСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ *}.

{* Π₯Π°Ρ„ΠΌΠ°Π½Π°. *}.

{******************************************************}.

Program Hafman;

Uses Crt, Dos, Printer;

Type PCodElement = ^CodElement;

CodElement = record.

NewLeft, NewRight,.

P0, P1: PCodElement; {элСмСнт входящий ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ}.

LengthBiteChain: byte; { Π² ΠΌΠ°ΡΡΠΈΠ², ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ Π΄Π΅Ρ€Π΅Π²ΠΎ }.

BiteChain: word;

CounterEnter: word;

Key: boolean;

Index: byte;

end;

TCodeTable = array [0.255] of PCodElement;

Var CurPoint, HelpPoint,.

LeftRange, RightRange: PCodElement;

CodeTable: TCodeTable;

Root: PCodElement;

InputF, OutputF, InterF: file;

TimeUnPakFile: longint;

AttrUnPakFile: word;

NumRead, NumWritten: Word;

InBuf: array[0.10 239] of byte;

OutBuf: array[0.10 239] of byte;

BiteChain: word;

CRC,.

CounterBite: byte;

OutCounter: word;

InCounter: word;

OutWord: word;

St: string;

LengthOutFile, LengthArcFile: longint;

Create: boolean;

NormalWork: boolean;

ErrorByte: byte;

DeleteFile: boolean;

{————————————————————————-}.

procedure ErrorMessage;

{ —- Π²Ρ‹Π²ΠΎΠ΄ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ —- }.

begin.

If ErrorByte 0 then.

begin.

Case ErrorByte of.

2: Writeln («File not found … »);

3: Writeln («Path not found … »);

5: Writeln («Access denied … »);

6: Writeln («Invalid handle … »);

8: Writeln («Not enough memory … »);

10: Writeln («Invalid environment … »);

11: Writeln («Invalid format … »);

18: Writeln («No more files … »);

else Writeln («Error # », ErrorByte, «… »);

end;

NormalWork:=False;

ErrorByte:=0;

end;

end;

procedure ResetFile;

{ —- ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° для Π°Ρ€Ρ…ΠΈΠ²Π°Ρ†ΠΈΠΈ —- }.

Var St: string;

begin.

Assign (InputF, ParamStr (3));

Reset (InputF, 1);

ErrorByte:=IOResult;

ErrorMessage;

If NormalWork then Writeln («Pak file: », ParamStr (3), «… »);

end;

procedure ResetArchiv;

{ —- ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΈΠ»ΠΈ Π΅Π³ΠΎ созданиС —- }.

begin.

St:=ParamStr (2);

If Pos («. », St)0 then Delete (St, Pos («. », St), 4);

St:=St+ " .vsg " ;

Assign (OutputF, St);

Reset (OutPutF, 1);

Create:=False;

If IOResult=2 then.

begin.

Rewrite (OutputF, 1);

Create:=True;

end;

If NormalWork then.

If Create then Writeln («Create archiv: », St, «… »).

else Writeln («Open archiv: », St, «… »).

end;

procedure SearchNameInArchiv;

{ —- Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ — поиск ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° Π² Π°Ρ€Ρ…ΠΈΠ²Π΅ —- }.

begin.

Seek (OutputF, FileSize (OutputF));

ErrorByte:=IOResult;

ErrorMessage;

end;

procedure DisposeCodeTable;

{ —- ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ —- }.

Var I: byte;

begin.

For I:=0 to 255 do Dispose (CodeTable[I]);

end;

procedure ClosePakFile;

{ —- Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° —- }.

Var I: byte;

begin.

If DeleteFile then Erase (InputF);

Close (InputF);

end;

procedure CloseArchiv;

{ —- Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° —- }.

begin.

If FileSize (OutputF)=0 then Erase (OutputF);

Close (OutputF);

end;

procedure InitCodeTable;

{ —- инициализация Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ —- }.

Var I: byte;

begin.

For I:=0 to 255 do.

begin.

New (CurPoint);

CodeTable[I]: =CurPoint;

With CodeTable[I]^ do.

begin.

P0:=Nil;

P1:=Nil;

LengthBiteChain:=0;

BiteChain:=0;

CounterEnter:=1;

Key:=True;

Index:=I;

end;

end;

For I:=0 to 255 do.

begin.

If I>0 then CodeTable[I-1]^.NewRight:=CodeTable[I];

If I CurPoint^.NewRight^.CounterEnter then.

begin.

HelpPoint:=CurPoint^.NewRight;

HelpPoint^.NewLeft:=CurPoint^.NewLeft;

CurPoint^.NewLeft:=HelpPoint;

If HelpPoint^.NewRightNil then HelpPoint^.NewRight^.NewLeft:=CurPoint;

CurPoint^.NewRight:=HelpPoint^.NewRight;

HelpPoint^.NewRight:=CurPoint;

If HelpPoint^.NewLeftNil then HelpPoint^.NewLeft^.NewRight:=HelpPoint;

If CurPoint=LeftRange then LeftRange:=HelpPoint;

If HelpPoint=RightRange then RightRange:=CurPoint;

CurPoint:=CurPoint^.NewLeft;

If CurPoint = LeftRange then CurPoint:=CurPoint^.NewRight.

else CurPoint:=CurPoint^.NewLeft;

end.

else CurPoint:=CurPoint^.NewRight;

end;

end;

procedure CounterNumberEnter;

{ —- подсчСт частот Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π±Π°ΠΉΡ‚ΠΎΠ² Π² Π±Π»ΠΎΠΊΠ΅ —- }.

Var C: word;

begin.

For C:=0 to NumRead-1 do.

Inc (CodeTable[(InBuf[C])]^.CounterEnter);

end;

function SearchOpenCode: boolean;

{ —- поиск Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΏΠ°Ρ€Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΠΎ Key ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ —- }.

begin.

CurPoint:=LeftRange;

HelpPoint:=LeftRange;

HelpPoint:=HelpPoint^.NewRight;

While not CurPoint^.Key do.

CurPoint:=CurPoint^.NewRight;

While (not (HelpPoint=RightRange)) and (not HelpPoint^.Key) do.

begin.

HelpPoint:=HelpPoint^.NewRight;

If (HelpPoint=CurPoint) and (HelpPointRightRange) then.

HelpPoint:=HelpPoint^.NewRight;

end;

If HelpPoint=CurPoint then SearchOpenCode:=False else SearchOpenCode:=True;

end;

procedure CreateTree;

{ —- созданиС Π΄Π΅Ρ€Π΅Π²Π° частот вхоТдСния —- }.

begin.

While SearchOpenCode do.

begin.

New (Root);

With Root^ do.

begin.

P0:=CurPoint;

P1:=HelpPoint;

LengthBiteChain:=0;

BiteChain:=0;

CounterEnter:=P0^.CounterEnter + P1^.CounterEnter;

Key:=True;

P0^.Key:=False;

P1^.Key:=False;

end;

HelpPoint:=LeftRange;

While (HelpPoint^.CounterEnter < Root^.CounterEnter) and.

(HelpPointNil) do HelpPoint:=HelpPoint^.NewRight;

If HelpPoint=Nil then { Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² ΠΊΠΎΠ½Π΅Ρ† }.

begin.

Root^.NewLeft:=RightRange;

RightRange^.NewRight:=Root;

Root^.NewRight:=Nil;

RightRange:=Root;

end.

else.

begin { вставка ΠΏΠ΅Ρ€Π΅Π΄ HelpPoint }.

Root^.NewLeft:=HelpPoint^.NewLeft;

HelpPoint^.NewLeft:=Root;

Root^.NewRight:=HelpPoint;

If Root^.NewLeftNil then Root^.NewLeft^.NewRight:=Root;

end;

end;

end;

procedure ViewTree (P: PCodElement);

{ —- просмотр Π΄Π΅Ρ€Π΅Π²Π° частот ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ†Π΅ΠΏΠ΅ΠΉ Π»ΠΈΡΡ‚ΡŒΡΠΌ —- }.

Var Mask, I: word;

begin.

Inc (CounterBite);

If P^.P0Nil then ViewTree (P^.P0);

If P^.P1Nil then.

begin.

Mask:=(1 SHL (16-CounterBite));

BiteChain:=BiteChain OR Mask;

ViewTree (P^.P1);

Mask:=(1 SHL (16-CounterBite));

BiteChain:=BiteChain XOR Mask;

end;

If (P^.P0=Nil) and (P^.P1=Nil) then.

begin.

P^.BiteChain:=BiteChain;

P^.LengthBiteChain:=CounterBite-1;

end;

Dec (CounterBite);

end;

procedure CreateCompressCode;

{ —- ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ Π·Π°ΠΏΡƒΡΠΊ просмотра Π΄Π΅Ρ€Π΅Π²Π° с Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ —- }.

begin.

BiteChain:=0;

CounterBite:=0;

Root^.Key:=False;

ViewTree (Root);

end;

procedure DeleteTree;

{ —- ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° —- }.

Var P: PCodElement;

begin.

CurPoint:=LeftRange;

While CurPointNil do.

begin.

If (CurPoint^.P0Nil) and (CurPoint^.P1Nil) then.

begin.

If CurPoint^.NewLeft Nil then.

CurPoint^.NewLeft^.NewRight:=CurPoint^.NewRight;

If CurPoint^.NewRight Nil then.

CurPoint^.NewRight^.NewLeft:=CurPoint^.NewLeft;

If CurPoint=LeftRange then LeftRange:=CurPoint^.NewRight;

If CurPoint=RightRange then RightRange:=CurPoint^.NewLeft;

P:=CurPoint;

CurPoint:=P^.NewRight;

Dispose (P);

end.

else CurPoint:=CurPoint^.NewRight;

end;

end;

procedure SaveBufHeader;

{ —- запись Π² Π±ΡƒΡ„Π΅Ρ€ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π°Ρ€Ρ…ΠΈΠ²Π° —- }.

Type.

ByteField = array[0.6] of byte;

Const.

Header: ByteField = ($ 56, $ 53, $ 31, $ 00, $ 00, $ 00, $ 00);

begin.

If Create then.

begin.

Move (Header, OutBuf[0], 7);

OutCounter:=7;

end.

else.

begin.

Move (Header[3], OutBuf[0], 4);

OutCounter:=4;

end;

end;

procedure SaveBufFATInfo;

{ —- запись Π² Π±ΡƒΡ„Π΅Ρ€ всСй ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎ Ρ„Π°ΠΉΠ»Ρƒ —- }.

Var I: byte;

St: PathStr;

R: SearchRec;

begin.

St:=ParamStr (3);

For I:=0 to Length (St)+1 do.

begin.

OutBuf[OutCounter]: =byte (Ord (St[I]));

Inc (OutCounter);

end;

FindFirst (St,$ 00,R);

Dec (OutCounter);

Move (R.Time, OutBuf[OutCounter], 4);

OutCounter:=OutCounter+4;

OutBuf[OutCounter]: =R.Attr;

Move (R.Size, OutBuf[OutCounter+1], 4);

OutCounter:=OutCounter+5;

end;

procedure SaveBufCodeArray;

{ —- ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ массив частот Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ —- }.

Var I: byte;

begin.

For I:=0 to 255 do.

begin.

OutBuf[OutCounter]: =Hi (CodeTable[I]^.CounterEnter);

Inc (OutCounter);

OutBuf[OutCounter]: =Lo (CodeTable[I]^.CounterEnter);

Inc (OutCounter);

end;

end;

procedure CreateCodeArchiv;

{ —- созданиС ΠΊΠΎΠ΄Π° сТатия —- }.

begin.

InitCodeTable; { инициализация ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ }.

CounterNumberEnter; { подсчСт числа Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π±Π°ΠΉΡ‚ Π² Π±Π»ΠΎΠΊ }.

SortQueueByte; { cΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ Π²ΠΎΠ·Ρ€Π°ΡΡ‚Π°Π½ΠΈΡŽ числа Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ }.

SaveBufHeader; { ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°Ρ€Ρ…ΠΈΠ²Π° Π² Π±ΡƒΡ„Π΅Ρ€Π΅ }.

SaveBufFATInfo; { сохраняСтся FAT информация ΠΏΠΎ Ρ„Π°ΠΉΠ»Ρƒ }.

SaveBufCodeArray; { ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ массив частот Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π² Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ }.

CreateTree; { созданиС Π΄Π΅Ρ€Π΅Π²Π° частот }.

CreateCompressCode; { cΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° сТатия }.

DeleteTree; { ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π΄Π΅Ρ€Π΅Π²Π° частот }.

end;

procedure PakOneByte;

{ —- сТатиС ΠΈ ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»ΠΊΠ° Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° —- }.

Var Mask: word;

Tail: boolean;

begin.

CRC:=CRC XOR InBuf[InCounter];

Mask:=CodeTable[InBuf[InCounter]]^.BiteChain SHR CounterBite;

OutWord:=OutWord OR Mask;

CounterBite:=CounterBite+CodeTable[InBuf[InCounter]]^.LengthBiteChain;

If CounterBite>15 then Tail:=True else Tail:=False;

While CounterBite>7 do.

begin.

OutBuf[OutCounter]: =Hi (OutWord);

Inc (OutCounter);

If OutCounter=(SizeOf (OutBuf)-4) then.

begin.

BlockWrite (OutputF, OutBuf, OutCounter, NumWritten);

OutCounter:=0;

end;

CounterBite:=CounterBite-8;

If CounterBite0 then OutWord:=OutWord SHL 8 else OutWord:=0;

end;

If Tail then.

begin.

Mask:=CodeTable[InBuf[InCounter]]^.BiteChain SHL.

(CodeTable[InBuf[InCounter]]^.LengthBiteChain-CounterBite);

OutWord:=OutWord OR Mask;

end;

Inc (InCounter);

If (InCounter=(SizeOf (InBuf))) or (InCounter=NumRead) then.

begin.

InCounter:=0;

BlockRead (InputF, InBuf, SizeOf (InBuf), NumRead);

end;

end;

procedure PakFile;

{ —- ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° нСпосрСдствСнного сТатия Ρ„Π°ΠΉΠ»Π° —- }.

begin.

ResetFile;

SearchNameInArchiv;

If NormalWork then.

begin.

BlockRead (InputF, InBuf, SizeOf (InBuf), NumRead);

OutWord:=0;

CounterBite:=0;

OutCounter:=0;

InCounter:=0;

CRC:=0;

CreateCodeArchiv;

While (NumRead0) do PakOneByte;

OutBuf[OutCounter]: =Hi (OutWord);

Inc (OutCounter);

OutBuf[OutCounter]: =CRC;

Inc (OutCounter);

BlockWrite (OutputF, OutBuf, OutCounter, NumWritten);

DisposeCodeTable;

ClosePakFile;

end;

end;

procedure ResetUnPakFiles;

{ —- ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° для распаковки —- }.

begin.

InCounter:=7;

St:= «» ;

repeat.

St[InCounter-7]: =Chr (InBuf[InCounter]);

Inc (InCounter);

until InCounter=InBuf[7]+8;

Assign (InterF, St);

Rewrite (InterF, 1);

ErrorByte:=IOResult;

ErrorMessage;

If NormalWork then.

begin.

WriteLn («UnPak file: », St, «… »);

Move (InBuf[InCounter], TimeUnPakFile, 4);

InCounter:=InCounter+4;

AttrUnPakFile:=InBuf[InCounter];

Inc (InCounter);

Move (InBuf[InCounter], LengthArcFile, 4);

InCounter:=InCounter+4;

end;

end;

procedure CloseUnPakFile;

{ —- Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° для распаковки —- }.

begin.

If not NormalWork then Erase (InterF).

else.

begin.

SetFAttr (InterF, AttrUnPakFile);

SetFTime (InterF, TimeUnPakFile);

end;

Close (InterF);

end;

procedure RestoryCodeTable;

{ —- воссозданиС ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ Π°Ρ€Ρ…ΠΈΠ²Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ —- }.

Var I: byte;

begin.

InitCodeTable;

For I:=0 to 255 do.

begin.

CodeTable[I]^.CounterEnter:=InBuf[InCounter];

CodeTable[I]^.CounterEnter:=CodeTable[I]^.CounterEnter SHL 8;

Inc (InCounter);

CodeTable[I]^.CounterEnter:=CodeTable[I]^.CounterEnter+InBuf[InCounter];

Inc (InCounter);

end;

end;

procedure UnPakByte (P: PCodElement);

{ —- распаковка ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° —- }.

Var Mask: word;

begin.

If (P^.P0=Nil) and (P^.P1=Nil) then.

begin.

OutBuf[OutCounter]: =P^.Index;

Inc (OutCounter);

Inc (LengthOutFile);

If OutCounter = (SizeOf (OutBuf)-1) then.

begin.

BlockWrite (InterF, OutBuf, OutCounter, NumWritten);

OutCounter:=0;

end;

end.

else.

begin.

Inc (CounterBite);

If CounterBite=9 then.

begin.

Inc (InCounter);

If InCounter = (SizeOf (InBuf)) then.

begin.

InCounter:=0;

BlockRead (OutputF, InBuf, SizeOf (InBuf), NumRead);

end;

CounterBite:=1;

end;

Mask:=InBuf[InCounter];

Mask:=Mask SHL (CounterBite-1);

Mask:=Mask OR $FF7 °F; { установка всСх Π±ΠΈΡ‚ΠΎΠ² ΠΊΡ€ΠΎΠΌΠ΅ ΡΡ‚Π°Ρ€ΡˆΠ΅Π³ΠΎ }.

If Mask=$FFFF then UnPakByte (P^.P1).

else UnPakByte (P^.P0);

end;

end;

procedure UnPakFile;

{ —- распаковка ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° —- }.

begin.

BlockRead (OutputF, InBuf, SizeOf (InBuf), NumRead);

ErrorByte:=IOResult;

ErrorMessage;

If NormalWork then ResetUnPakFiles;

If NormalWork then.

begin.

RestoryCodeTable;

SortQueueByte;

CreateTree; { созданиС Π΄Π΅Ρ€Π΅Π²Π° частот }.

CreateCompressCode;

CounterBite:=0;

OutCounter:=0;

LengthOutFile:=0;

While LengthOutFile LengthArcFile do.

UnPakByte (Root);

BlockWrite (InterF, OutBuf, OutCounter, NumWritten);

DeleteTree;

DisposeCodeTable;

end;

CloseUnPakFile;

end;

{ ————————————- main text ————————————- }.

begin.

DeleteFile:=False;

NormalWork:=True;

ErrorByte:=0;

WriteLn;

WriteLn («ArcHaf version 1.0 © Copyright VVS Soft Group, 1992. »);

ResetArchiv;

If NormalWork then.

begin.

St:=ParamStr (1);

Case St[1] of.

" a ", «A »: PakFile;

" m ", «M »: begin.

DeleteFile:=True;

PakFile;

end;

" e ", «E »: UnPakFile;

else ;

end;

end;

CloseArchiv;

end.

Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

Для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π±Ρ‹Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ с ΡΠ°ΠΉΡ‚Π° internet.

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ