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

Алгоритм RLE

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

Π’ ΠΌΠΎΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ я Π½Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽ символы, Ссли Π΄Π»ΠΈΠ½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ мСньшС 3. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: AABB; ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:! 2A! 2B. А ΡΡ‚ΠΎ Π½Π° 33% большС исходного ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, ΠΏΡ€ΠΈ сТатии, Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ символа ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ повторСния, Ρ‚ΠΎ ΠΎΠ½ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ся ΠΊΠ°ΠΊ ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ_повторСнияNΠŸΡ€ΠΈΠ·Π½Π°ΠΊ_повторСния. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ N Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΎΡ‚ 1. НапримСр: A! B… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Алгоритм RLE (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

1. ОписаниС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ°

RLE — Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ сТатия Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сСриями Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡΠΌΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ символ встрСчаСтся нСсколько Ρ€Π°Π· подряд. ΠŸΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ строка ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… символов, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… ΡΠ΅Ρ€ΠΈΡŽ, замСняСтся строкой, которая содСрТит сам ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‰ΠΈΠΉΡΡ символ ΠΈ ΠΊΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ².

ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ эффСктивно для Π΄Π°Π½Π½Ρ‹Ρ…, содСрТащих большоС количСство сСрий, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для простых графичСских ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ ΠΈΠΊΠΎΠ½ΠΊΠΈ ΠΈ Π³Ρ€Π°Ρ„ичСскиС рисунки. Однако это ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ с ΠΏΠ»Π°Π²Π½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠΌ Ρ‚ΠΎΠ½ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Ρ„ΠΎΡ‚ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΈ.

ПсСвдокод сТатия:

1. Пока Π½Π΅ ΠΊΠΎΠ½Π΅Ρ† Π’Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

1.1. Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π‘ΠΈΠΌΠ²ΠΎΠ»

1.2. Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ Ρ€Π°Π²Π½ΠΎ Π‘ΠΈΠΌΠ²ΠΎΠ»

1.3. Π”Π»ΠΈΠ½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Ρ€Π°Π²Π½Π° 1

1.4. Пока Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ Ρ€Π°Π²Π΅Π½ Π‘ΠΈΠΌΠ²ΠΎΠ» И Π½Π΅ ΠΊΠΎΠ½Π΅Ρ† Π’Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

1.4.1. Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ

1.4.2. Если Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ Ρ€Π°Π²Π΅Π½ Π‘ΠΈΠΌΠ²ΠΎΠ», Ρ‚ΠΎ

1.4.2.1. Π£Π²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ Π”Π»ΠΈΠ½Ρƒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ

1.5. Π‘ΠΈΠΌΠ²ΠΎΠ» Ρ€Π°Π²Π½ΠΎ Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ символ

1.6. Если Π”Π»ΠΈΠ½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ большС 1, Ρ‚ΠΎ

1.6.1. Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ: ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ повторСния, Π”Π»ΠΈΠ½Ρƒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈ Π‘ΠΈΠΌΠ²ΠΎΠ»

1.7. Π˜Π½Π°Ρ‡Π΅

1.7.1. ВынСсти Π‘ΠΈΠΌΠ²ΠΎΠ» Π² Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ПсСвдокод дСкодирования:

1. Пока Π½Π΅ ΠΊΠΎΠ½Π΅Ρ† Π’Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°

1.1. Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π‘ΠΈΠΌΠ²ΠΎΠ»

1.2. Если Π‘ΠΈΠΌΠ²ΠΎΠ» Ρ€Π°Π²Π΅Π½ ΠŸΡ€ΠΈΠ·Π½Π°ΠΊΡƒ повторСния, Ρ‚ΠΎ

1.2.1. Π Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ Π² Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ

1.3. Π˜Π½Π°Ρ‡Π΅

1.3.1. ВывСсти Π² Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ Π‘ΠΈΠΌΠ²ΠΎΠ»

2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Π‘ΠΈΠΌΠ²ΠΎΠ» повторСния:!

Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ: AAAAABBBBACCCC

Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ:! 5A! 4B A! 4C

Π’ ΠΌΠΎΠ΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ я Π½Π΅ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΡŽ символы, Ссли Π΄Π»ΠΈΠ½Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ мСньшС 3. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: AABB; ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:! 2A! 2B. А ΡΡ‚ΠΎ Π½Π° 33% большС исходного ΠΏΠΎΡ‚ΠΎΠΊΠ°. Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ, ΠΏΡ€ΠΈ сТатии, Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ символа ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ повторСния, Ρ‚ΠΎ ΠΎΠ½ ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ся ΠΊΠ°ΠΊ ΠŸΡ€ΠΈΠ·Π½Π°ΠΊ_повторСнияNΠŸΡ€ΠΈΠ·Π½Π°ΠΊ_повторСния. ΠŸΡ€ΠΈΡ‡Π΅ΠΌ N Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΠΎΡ‚ 1. НапримСр: A! B; кодируСтся ΠΊΠ°ΠΊ: A! 1! B.

3. Анализ эффСктивности

ВСорСтичСская ΠΎΡ†Π΅Π½ΠΊΠ°

ΠŸΡ€ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° RLE, Π΄Π»ΠΈΠ½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ большС Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ, Ссли Π² Π½Ρ‘ΠΌ часто встрСчаСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ повторСния Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ мСньшС 3 символов, ΠΈ Ρ€Π΅Π΄ΠΊΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π»ΠΈΠ½ΠΎΠΉ большС 3 символов.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ стСпСни сТатия ΠΏΡ€ΠΈ условии Ρ‡Ρ‚ΠΎ число Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² символа Ρ€Π°Π²Π½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ числу повторСния:

Β· Максимальная ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия:, Π³Π΄Π΅ N — это число Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа; практичСски Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли всС символы Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π΄Π»ΠΈΠ½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ€Π°Π²Π½Π° ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ числу ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ.

Β· Минимальная ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия:, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 символа, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ повторСния, Ρ‡Ρ‚ΠΎ практичСски Π½Π΅ Π²ΡΡ‚рСчаСтся

Β· БрСдняя ΠΆΠ΅ ΠΎΡ†Π΅Π½ΠΊΠ° сильно зависит ΠΎΡ‚ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° сТимаСмого Ρ„Π°ΠΉΠ»Π°

4. Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Π°Ρ ΠΎΡ†Π΅Π½ΠΊΠ°

Для Π°Π½Π°Π»ΠΈΠ·Π° эффСктивности Π±Ρ‹Π»ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Ρ‹ Ρ„Π°ΠΉΠ»Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΈ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ прСдставлСны Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…:

Π’ΠΈΠΏ Ρ„Π°ΠΉΠ»Π°

Π Π°Π·ΠΌΠ΅Ρ€ исходного Ρ„Π°ΠΉΠ»Π° (Π±Π°ΠΉΡ‚)

Π Π°Π·ΠΌΠ΅Ρ€ сТатого Ρ„Π°ΠΉΠ»Π° (Π±Π°ΠΉΡ‚)

Π‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия

111.txt

2 449

2 449

100%

222.jpg

43 816

44 026

100,48%

333.docx

125 124

123 719

98,88%

444.doc

168 960

151 231

89,51%

555.bmp

747 574

34 585

4,64%

666.exe

3 941 312

3 962 809

100,55%

777.avi

733 470 870

738 582 664

100,7%

Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Π°Ρ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ сТатия ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅:

Из ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия зависит ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»Π°. Π€Π°ΠΉΠ»Ρ‹ JPEG, DOCX, AVI, DOC ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΡƒΠΆΠ΅ сТатыми ΠΈ ΠΏΠΎΡΡ‚ΠΎΠΌΡƒ практичСски Π½Π΅ ΠΏΠΎΠ΄Π΄Π°ΡŽΡ‚ся ΡΠΆΠ°Ρ‚ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ RLE, Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ эффСкт. Π€Π°ΠΉΠ»Ρ‹ TEXT ΠΈ EXE сильно зависят ΠΎΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΡ поэтому Ρ‚ΡƒΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹. А Ρ„Π°ΠΉΠ»Ρ‹ BMP ΡΠ²Π»ΡΡŽΡ‚ΡΡ нСсТатыми ΠΈ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв сТатиС происходит с Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ коэффициСнтом.

5. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Form1.cs:

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

using System. IO;

namespace RLE

{

public partial class Form1: Form

{

string File;

string FileCode;

string FileDecode;

RLE RLE;

public Form1 ()

{

InitializeComponent ();

RLE = new RLE ();

RLE. Percent += new IntHandler (RLE_PercentChanged);

}

void RLE_PercentChanged (int t) {ProgressBar. Value = t;}

private void Packed (object sender, EventArgs e)

{

if (! RLE. IsBusy)

{

OpenDialog. FileName = ««;

OpenDialog. Filter = ««;

if (sender == null || OpenDialog. ShowDialog () == DialogResult. OK)

{

if (sender == null) OpenDialog. FileName = File;

SaveDialog. FileName = OpenDialog. FileName +". rle";

SaveDialog. Filter = «Π€Π°ΠΉΠ»Ρ‹ RLE|*.rle»;

SaveDialog. AddExtension = true;

SaveDialog. CreatePrompt = false;

if (SaveDialog. ShowDialog () == DialogResult. OK)

{

if (SaveDialog. FileName == OpenDialog. FileName)

{

System.IO. File. Move (OpenDialog. FileName, OpenDialog. FileName +". bak");

File = OpenDialog. FileName +". bak";

}

else

{

File = OpenDialog. FileName;

}

FileCode = SaveDialog. FileName;

RLE. Code (File, FileCode);

}

}

}

else

MessageBox. Show («Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ окончания процСсса!», «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

private void UnPacked (object sender, EventArgs e)

{

if (! RLE. IsBusy)

{

OpenDialog. FileName = ««;

OpenDialog. Filter = «Π€Π°ΠΉΠ»Ρ‹ RLE|*.rle|ВсС Ρ„Π°ΠΉΠ»Ρ‹|*.*»;

if (sender == null || OpenDialog. ShowDialog () == DialogResult. OK)

{

if (sender == null) OpenDialog. FileName = FileCode;

string rle =". rle";

bool isNorm = true;

for (int i = 0; i <οΏ½ 4 && isNorm; i++)

if (OpenDialog. FileName [OpenDialog. FileName. Length — 4 + i]≠ rle[i])

isNorm = false;

if (isNorm)

SaveDialog. FileName = OpenDialog. FileName. Remove (OpenDialog. FileName. Length — 4, 4);

else

SaveDialog. FileName = OpenDialog. FileName;

SaveDialog. CreatePrompt = false;

if (SaveDialog. ShowDialog () == DialogResult. OK)

{

if (SaveDialog. FileName == OpenDialog. FileName)

{

System.IO. File. Move (OpenDialog. FileName, OpenDialog. FileName +". bak");

FileCode = OpenDialog. FileName +". bak";

}

else

{

FileCode = OpenDialog. FileName;

}

FileDecode = SaveDialog. FileName;

RLE. Decode (FileCode, FileDecode);

}

}

}

else

MessageBox. Show («Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ окончания процСсса!»);

}

private void Form1_FormClosing (object sender, FormClosingEventArgs e)

{

if (RLE. IsBusy)

{

if (MessageBox. Show («Π’Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Ρ‡Ρ‚ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ процСсс?», «Π’Ρ‹Ρ…ΠΎΠ΄», MessageBoxButtons. YesNo) == DialogResult. Yes)

{

RLE. Stop (true);

e. Cancel = false;

}

else

e. Cancel = true;

}

}

private void Packed_DragDrop (object sender, DragEventArgs e)

{

string[] s = (string[]) e. Data. GetData (DataFormats. FileDrop, false);

if (s≠ null)

if (s. Length == 1)

{

File = s[0];

Packed (null, null);

}

else

MessageBox. Show («ΠšΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ!», «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

private void UnPacked_DragDrop (object sender, DragEventArgs e)

{

string[] s = (string[]) e. Data. GetData (DataFormats. FileDrop, false);

if (s≠ null)

if (s. Length == 1)

{

FileCode = s[0];

UnPacked (null, null);

}

else

MessageBox. Show («ΠšΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ„Π°ΠΉΠ»Ρƒ!», «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

private void DragEnter (object sender, DragEventArgs e)

{

if (e. Data. GetDataPresent (DataFormats. FileDrop))

e. Effect = DragDropEffects. Move;

else

e. Effect = DragDropEffects. None;

}

}

}

RLE.cs:

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. IO;

using System. Windows. Forms;

using System. ComponentModel;

namespace RLE

{

delegate void IntHandler (int t);

class RLE

{

private enum Pack {Packed, Unpacked};

class Str

{

public Pack PK;

public string Input;

public string Output;

}

BackgroundWorker BW;

public event IntHandler Percent;

const byte UN = 66;

int Pred, Tek, Count;

BinaryReader Reader;

BinaryWriter Writer;

public RLE ()

{

BW = new BackgroundWorker ();

BW. DoWork += new DoWorkEventHandler (BW_DoWork);

BW. RunWorkerCompleted += new RunWorkerCompletedEventHandler (BW_RunWorkerCompleted);

BW. ProgressChanged += new ProgressChangedEventHandler (BW_ProgressChanged);

BW. WorkerReportsProgress = true;

BW. WorkerSupportsCancellation = true;

}

public void Stop (bool isForce)

{

BW. CancelAsync ();

if (Percent≠ null) Percent (0);

if (! isForce) MessageBox. Show («ΠžΡ‚ΠΌΠ΅Π½Π΅Π½ΠΎ»);

}

void BW_ProgressChanged (object sender, ProgressChangedEventArgs e)

{

if (Percent≠ null) Percent (e. ProgressPercentage);

}

void BW_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e)

{

if (! e. Cancelled)

{

if (Percent≠ null) Percent (100);

if (e. Result≠ null)

{

if (e. Result. GetType () == typeof (string))

MessageBox. Show ((string) e. Result);

else

MessageBox. Show («Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ», «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

else

MessageBox. Show («Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ», «Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅», MessageBoxButtons. OK, MessageBoxIcon. Information);

}

}

void BW_DoWork (object sender, DoWorkEventArgs e)

{

string File, FileCode, FileDecode;

int Proc;

if ((e. Argument as Str).PK == Pack. Packed)

{

BW. ReportProgress (0);

Proc = 0;

File = (e. Argument as Str).Input;

FileCode = (e. Argument as Str).Output;

Reader = new BinaryReader (new FileStream (File, FileMode. Open));

Writer = new BinaryWriter (new FileStream (FileCode, FileMode. Create));

long L = 0;

Pred = -1; Tek = -1; Count = 0;

try

{

Tek = Reader. ReadByte ();

L++;

do

{

if (BW. CancellationPending)

throw new ApplicationException ();

if (Proc≠ (int) (L * 100 / AllByte))

{

Proc = (int) (L * 100 / AllByte);

BW. ReportProgress ((int) (L * 100 / AllByte));

}

if (Tek≠ Pred)

{

InputPred ();

Count = 1;

}

else //Tek == Pred

{

if (Count == 255)

{

InputPred ();

Count = 1;

}

else

Count++;

}

Pred = Tek;

Tek = Reader. ReadByte ();

L++;

} while (true);

}

catch (EndOfStreamException)

{

if (Tek == -1)

MessageBox. Show («Π€Π°ΠΉΠ» пуст»);

else

{

InputPred ();

Writer. Close ();

long ResLen = (new FileInfo (FileCode)).Length;

e. Result = «Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ! nΠ Π°Π·ΠΌΠ΅Ρ€ Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:» + string. Format («{0:0,0.###}», (double) AllByte / 1024.0) +

«KBnΠ Π°Π·ΠΌΠ΅Ρ€ Π‘ΠΆΠ°Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:» + string. Format («{0:0,0.###}», (double) ResLen / 1024.0) +

«KBnΠ‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ сТатия:» + string. Format («{0:F2}», (double) ResLen / (double) AllByte * 100.0) + «%»;

}

Reader. Close ();

Writer. Close ();

}

catch (ApplicationException)

{

Reader. Close ();

Writer. Close ();

System.IO. File. Delete (FileCode);

}

}

/////////////////////////////////////////////////////

if ((e. Argument as Str).PK == Pack. Unpacked)

{

BW. ReportProgress (0);

Proc = 0;

FileCode = (e. Argument as Str).Input;

FileDecode = (e. Argument as Str).Output;

Reader = new BinaryReader (new FileStream (FileCode, FileMode. Open));

Writer = new BinaryWriter (new FileStream (FileDecode, FileMode. Create));

long L = 0;

try

{

do

{

if (BW. CancellationPending)

throw new ApplicationException ();

Tek = Reader. ReadByte ();

L++;

// Proc = (int) (L * 100 / AllByte);

if (Proc≠ (int) (L * 100 / AllByte))

{

Proc = (int) (L * 100 / AllByte);

BW. ReportProgress ((int) (L * 100 / AllByte));

}

if (Tek≠ UN)

{

Writer. Write ((byte) Tek);

}

else

{

Pred = Reader. ReadByte ();

Tek = Reader. ReadByte ();

L += 2;

for (Count = 0; Count <οΏ½ Pred; Count++)

Writer. Write ((byte) Tek);

}

} while (true);

}

catch (EndOfStreamException)

{

Reader. Close ();

Writer. Close ();

}

catch (ApplicationException)

{

Reader. Close ();

Writer. Close ();

System.IO. File. Delete (FileDecode);

}

}

}

void InputUN ()

{

Writer. Write (UN);

Writer. Write ((byte) 1);

Writer. Write (UN);

}

vod InputPred ()

{

if (Count > 0)

{

/*if (Pred == UN)

InputUN ();

else*/

if (Count > 1)

{

if (Count == 2 && Pred≠ UN)

{

Writer. Write ((byte) Pred);

Writer. Write ((byte) Pred);

}

else

{

Writer. Write (UN);

Writer. Write ((byte) Count);

Writer. Write ((byte) Pred);

}

}

else if (Count == 1)

{

if (Pred == UN)

InputUN ();

else

Writer. Write ((byte) Pred);

}

}

}

long AllByte;

public void Code (string File, string FileCode)

{

if (! BW. IsBusy)

{

FileInfo info = new FileInfo (File);

AllByte = (long) info. Length;

BW. RunWorkerAsync (new Str {PK = Pack. Packed, Input = File, Output = FileCode});

}

else

{

MessageBox. Show («Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ окончания процСсса!»);

}

}

public bool IsBusy {get {return BW. IsBusy;}}

public void Decode (string FileCode, string FileDecode)

{

if (! BW. IsBusy)

{

FileInfo info = new FileInfo (FileCode);

AllByte = (long) info. Length;

BW. RunWorkerAsync (new Str {PK = Pack. Unpacked, Input = FileCode, Output = FileDecode});

}

else

{

MessageBox. Show («Π”ΠΎΠΆΠ΄ΠΈΡ‚Π΅ΡΡŒ окончания процСсса!»);

}

}

}

}

Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° сТатиС Ρ„Π°ΠΉΠ»

1. «Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ сТатия ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΡŒ» — ΠœΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡Π΅ΡΠΊΠΎΠ΅ пособиС, ΠŸΠ°Π½Ρ‚Π΅Π»Π»Π΅Π² Π•. Π . — Π˜Π²Π°Π½ΠΎΠ²ΠΎ 2001 Π³.

2. http://ru.wikipedia.org/wiki/RLE

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