ΠΠ»Π³ΠΎΡΠΈΡΠΌ 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