ΠΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅
Π Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎΠ± ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅ Π₯Π°ΡΡΠΌΠ°Π½Π°, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎ Π΅Π³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π² ΡΠΆΠ°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ .
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠ΅Π½ΡΠΊΠΈΠΉ Π°ΡΡ
ΠΈΠ²Π°ΡΠΎΡ. ΠΠ± ΡΡΠΎΠΌ ΡΠΆΠ΅ Π±ΡΠ»Π°
ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΡΡΠ»Π΅Π½ΠΈΠΉ
Π ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΠΎΠ΄ΠΈΠ½ ΡΠΈΠΌΠ²ΠΎΠ» ΠΊΠΎΠ΄ΠΈΡΡΠ΅ΡΡΡ 8 Π±ΠΈΡΠ°ΠΌΠΈ(ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° ASCII) ΠΈΠ»ΠΈ 16(ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° Unicode). ΠΠ°Π»Π΅Π΅ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΡ ASCII. ΠΠ»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ ΡΡΡΠΎΠΊΡ s1 = Β«SUSIE SAYS IT IS EASYnΒ». ΠΡΠ΅Π³ΠΎ Π² ΡΡΡΠΎΠΊΠ΅ 22 ΡΠΈΠΌΠ²ΠΎΠ»Π°, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π΅Π»Ρ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ β ‘n’. Π€Π°ΠΉΠ», ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π΄Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΠΈΡΡ 22*8 = 176 Π±ΠΈΡ. Π‘ΡΠ°Π·Ρ ΠΆΠ΅ Π²ΡΡΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ: ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ 8 Π±ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ 1 ΡΠΈΠΌΠ²ΠΎΠ»Π°? ΠΡ Π²Π΅Π΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π½Π΅ Π²ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ ASCII. ΠΠ°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π±Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ, ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½Π΅ΠΉ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°ΠΌΠΎΠΉ ΡΠ°ΡΡΠΎΠΉ Π±ΡΠΊΠ²Π΅ β S β Π΄Π°ΡΡ ΡΠ°ΠΌΡΠΉ ΠΊΠΎΡΠΎΡΠΊΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΉ ΠΊΠΎΠ΄, Π° Π΄Π»Ρ ΡΠ°ΠΌΠΎΠΉ ΡΠ΅Π΄ΠΊΠΎΠΉ Π±ΡΠΊΠ²Π΅ β T (ΠΈΠ»ΠΈ U, ΠΈΠ»ΠΈ ‘n’) β Π΄Π°ΡΡ ΠΊΠΎΠ΄ ΠΏΠΎΠ΄Π»ΠΈΠ½Π½Π΅Π΅. Π ΡΡΠΎΠΌ ΠΈ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π₯Π°ΡΡΠΌΠ°Π½Π°: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΉΡΠΈ ΠΎΠΏΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π²Π΅ΡΠ°. ΠΠΏΠΎΠ»Π½Π΅ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΡΠΎ Ρ ΡΠ°Π·Π½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² Π΄Π»ΠΈΠ½Ρ ΠΊΠΎΠ΄Π° Π±ΡΠ΄ΡΡ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ β Π½Π° ΡΡΠΎΠΌ ΠΈ ΠΎΡΠ½ΠΎΠ²Π°Π½ Π°Π»Π³ΠΎΡΠΈΡΠΌ.
ΠΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΠΎΡΠ΅ΠΌΡ Π±Ρ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ‘S’ Π½Π΅ Π΄Π°ΡΡ ΠΊΠΎΠ΄, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»ΠΈΠ½ΠΎΠΉ Π² 1 Π±ΠΈΡ: 0 ΠΈΠ»ΠΈ 1. ΠΡΡΡΡ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ 1. Π’ΠΎΠ³Π΄Π° Π²ΡΠΎΡΠΎΠΌΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²ΡΡΡΠ΅ΡΠ°ΡΡΠ΅ΠΌΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ»Ρ β ‘ ‘(ΠΏΡΠΎΠ±Π΅Π») β Π΄Π°Π΄ΠΈΠΌ 0. ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠ΅Π±Π΅, Π²Ρ Π½Π°ΡΠ°Π»ΠΈ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ β Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠΎΠΊΡ s1 β ΠΈ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΠΎ ΠΊΠΎΠ΄ Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ 1. ΠΡΠ°ΠΊ, ΡΡΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°ΡΡ: ΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ» S, ΠΈΠ»ΠΈ ΠΆΠ΅ ΡΡΠΎ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ A? ΠΠΎΡΡΠΎΠΌΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ Π²Π°ΠΆΠ½ΠΎΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ:
ΠΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ
ΠΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ Π² Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅. ΠΠΎΡΡΠΎΠΌΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ ΡΠ°ΡΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΊΠ°Π·Π°Π½Π° ΡΠ°ΡΡΠΎΡΠ° (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ) ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π°:
Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ Ρ Π½Π°ΠΈΠ±ΠΎΠ»ΡΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π²Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡΡΡ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠΈΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ Π±ΠΈΡΠΎΠ². ΠΡΠΈΠ²Π΅Π΄Ρ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡ ΠΊΠΎΠ΄ΠΎΠ²:
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ°ΠΊ:
10 01111 10 110 1111 00 10 010 1110 10 00 110 0110 00 110 10 00 1111 010 10 1110 01110
ΠΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Ρ ΡΠ°Π·Π΄Π΅Π»ΠΈΠ» ΠΏΡΠΎΠ±Π΅Π»ΠΎΠΌ. ΠΠΎ-Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π² ΡΠΆΠ°ΡΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ ΡΠ°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π±ΡΠ΄Π΅Ρ!
ΠΡΡΠ΅ΠΊΠ°Π΅Ρ Π²ΠΎΠΏΡΠΎΡ: ΠΊΠ°ΠΊ ΡΡΠΎΡ ΡΠ°Π»Π°Π³Π° ΠΏΡΠΈΠ΄ΡΠΌΠ°Π» ΠΊΠΎΠ΄ ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠΎΠ΄ΠΎΠ²? ΠΠ± ΡΡΠΎΠΌ ΠΏΠΎΠΉΠ΄Π΅Ρ ΡΠ΅ΡΡ Π½ΠΈΠΆΠ΅.
ΠΠΎΡΡΡΠΎΠ΅Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅Π²Π° Π₯Π°ΡΡΠΌΠ°Π½Π°
ΠΠ΄Π΅ΡΡ ΠΏΡΠΈΡ ΠΎΠ΄ΡΡ Π½Π° Π²ΡΡΡΡΠΊΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ ΠΏΠΎΠΈΡΠΊΠ°. ΠΠ΅ Π²ΠΎΠ»Π½ΡΠΉΡΠ΅ΡΡ, Π·Π΄Π΅ΡΡ ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΏΠΎΠΈΡΠΊΠ°, Π²ΡΡΠ°Π²ΠΊΠΈ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ Π½Π΅ ΠΏΠΎΡΡΠ΅Π±ΡΡΡΡΡ. ΠΠΎΡ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π΅ΡΠ΅Π²Π° Π½Π° java:
public class Node {
private int frequence;
private char letter;
private Node leftChild;
private Node rightChild;
...
}
class BinaryTree {
private Node root;
public BinaryTree() {
root = new Node();
}
public BinaryTree(Node root) {
this.root = root;
}
...
}
ΠΡΠΎ Π½Π΅ ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄, ΠΏΠΎΠ»Π½ΡΠΉ ΠΊΠΎΠ΄ Π±ΡΠ΄Π΅Ρ Π½ΠΈΠΆΠ΅.
ΠΠΎΡ ΡΠ°ΠΌ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π΄Π΅ΡΠ΅Π²Π°:
- Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Node Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΈΠ· ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ(ΡΡΡΠΎΠΊΠ° s1). Π Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ 9 ΡΠ·Π»ΠΎΠ²(ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Node). ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π΄Π²ΡΡ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π°Π½Π½ΡΡ : ΡΠΈΠΌΠ²ΠΎΠ» ΠΈ ΡΠ°ΡΡΠΎΡΠ°
- Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΠ΅ΡΠ΅Π²Π°(BinaryTree) Π΄Π»Ρ ΠΊΠ°ΠΆΠ»ΠΎΠ³ΠΎ ΠΈΠ· ΡΠ·Π»ΠΎΠ² Node. Π£Π·Π΅Π» ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΠΊΠΎΡΠ½Π΅ΠΌ Π΄Π΅ΡΠ΅Π²Π°.
- ΠΡΡΠ°Π²ΠΈΡΡ ΡΡΠΈ Π΄Π΅ΡΠ΅Π²ΡΡ Π² ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. Π§Π΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°ΡΡΠΎΡΠ°, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΏΡΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅Π³Π΄Π° Π²ΡΠ±ΠΈΡΠ°Π΅ΡΡΡ Π΄Π΅ΡΠ²ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ.
ΠΠ°Π»Π΅Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΈ Π΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
- ΠΠ·Π²Π»Π΅ΡΡ Π΄Π²Π° Π΄Π΅ΡΠ΅Π²Π° ΠΈΠ· ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΡ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ·Π»Π° (ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ·Π»Π° Π±Π΅Π· Π±ΡΠΊΠ²Ρ). Π§Π°ΡΡΠΎΡΠ° Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ·Π»Π° ΡΠ°Π²Π½Π° ΡΡΠΌΠΌΠ΅ ΡΠ°ΡΡΠΎΡ Π΄Π²ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅Π²-ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ².
- ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠ·Π»Π° ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π΅ΡΠ΅Π²ΠΎ Ρ ΠΊΠΎΡΠ½Π΅ΠΌ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ·Π»Π΅. ΠΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. (Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ Π΄Π΅ΡΠ΅Π²Π° Π½ΠΎΠ²Π°Ρ ΡΠ°ΡΡΠΎΡΠ°, ΡΠΎ ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ ΠΎΠ½Π° Π²ΡΡΠ°Π½Π΅Ρ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ)
- ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΡΠ°Π³ΠΎΠ² 1 ΠΈ 2, ΠΏΠΎΠΊΠ° Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π΅ ΠΎΡΡΠ°Π½Π΅ΡΡΡ ΠΎΠ΄Π½ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ β Π΄Π΅ΡΠ΅Π²ΠΎ Π₯Π°ΡΡΠΌΠ°Π½Π°
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ Π½Π° ΡΡΡΠΎΠΊΠ΅ s1:
ΠΠ΄Π΅ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» Β«lfΒ»(linefeed) ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ, Β«spΒ» (space) β ΡΡΠΎ ΠΏΡΠΎΠ±Π΅Π».
Π ΡΡΠΎ Π΄Π°Π»ΡΡΠ΅?
ΠΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π΄Π΅ΡΠ΅Π²ΠΎ Π₯Π°ΡΡΠΌΠ°Π½Π°. ΠΡ ΠΎΠΊΠ΅ΠΉ. Π ΡΡΠΎ Ρ Π½ΠΈΠΌ Π΄Π΅Π»Π°ΡΡ? ΠΠ³ΠΎ ΠΈ Π·Π° Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ Π½Π΅ Π²ΠΎΠ·ΡΠΌΡΡ Π Π΄Π°Π»Π΅Π΅, Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅Π΄ΠΈΡΡ Π²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΡΡΠΈ ΠΎΡ ΠΊΠΎΡΠ½Ρ Π΄ΠΎ Π»ΠΈΡΡΠΎΠ² Π΄Π΅ΡΠ΅Π²Π°. Π£ΡΠ»ΠΎΠ²ΠΈΠΌΡΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠΈΡΡ ΡΠ΅Π±ΡΠΎ 0, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ Π²Π΅Π΄Π΅Ρ ΠΊ Π»Π΅Π²ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΌΠΊΡ ΠΈ 1 β Π΅ΡΠ»ΠΈ ΠΊ ΠΏΡΠ°Π²ΠΎΠΌΡ. Π‘ΡΡΠΎΠ³ΠΎ Π³ΠΎΠ²ΠΎΡΡ, Π² Π΄Π°Π½Π½ΡΡ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡΡ , ΠΊΠΎΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π° β ΡΡΠΎ ΠΏΡΡΡ ΠΎΡ ΠΊΠΎΡΠ½Ρ Π΄Π΅ΡΠ΅Π²Π° Π΄ΠΎ Π»ΠΈΡΡΠ°, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΡΡΠΎΡ ΡΠ°ΠΌΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ».
Π’Π°ΠΊΠΈΠΌ ΠΌΠ°ΠΊΠ°ΡΠΎΠΌ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ ΡΠ°Π±Π»ΠΈΡΠ° ΠΊΠΎΠ΄ΠΎΠ². ΠΠ°ΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄ ΠΎ Β«Π²Π΅ΡΠ΅Β» ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° β ΡΡΠΎ Π΄Π»ΠΈΠ½Π° Π΅Π³ΠΎ ΠΊΠΎΠ΄Π°. Π’ΠΎΠ³Π΄Π° Π² ΡΠΆΠ°ΡΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈΡΡ
ΠΎΠ΄Π½ΡΠΉ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ Π²Π΅ΡΠΈΡΡ: 2 * 3 + 2*4 + 3 * 3 + 6 * 2 + 1 * 4 + 1 * 5 + 2 * 4 + 4 * 2 + 1 * 5 = 65 Π±ΠΈΡ. ΠΠ½Π°ΡΠ°Π»Π΅ ΠΎΠ½ Π²Π΅ΡΠΈΠ» 176 Π±ΠΈΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΡ ΡΠΌΠ΅Π½ΡΡΠΈΠ»ΠΈ Π΅Π³ΠΎ Π°ΠΆ Π² 176/65 = 2.7 ΡΠ°Π·Π°! ΠΠΎ ΡΡΠΎ ΡΡΠΎΠΏΠΈΡ. Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ Π²ΡΡΠ΄ Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½. ΠΠΎΡΠ΅ΠΌΡ? ΠΠ± ΡΡΠΎΠΌ ΠΏΠΎΠΉΠ΄Π΅Ρ ΡΠ΅ΡΡ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.
ΠΠ΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΠΎΡΡΠ°Π»ΠΎΡΡ ΡΠ°ΠΌΠΎΠ΅ ΠΏΡΠΎΡΡΠΎΠ΅ β Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. Π― Π΄ΡΠΌΠ°Ρ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· Π²Π°Ρ Π΄ΠΎΠ³Π°Π΄Π°Π»ΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠΆΠ°ΡΡΠΉ ΡΠ°ΠΉΠ» Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ Π½Π°ΠΌΠ΅ΠΊΠΎΠ² Π½Π° ΡΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ Π±ΡΠ» Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½, Π½Π΅Π»ΡΠ·Ρ β ΠΌΡ Π½Π΅ ΡΠΌΠΎΠΆΠ΅ΠΌ Π΅Π³ΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ! ΠΠ°-Π΄Π°, ΠΌΠ½Π΅ Π±ΡΠ»ΠΎ ΡΡΠΆΠ΅Π»ΠΎ ΡΡΠΎ ΠΎΡΠΎΠ·Π½Π°ΡΡ, Π½ΠΎ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΉ ΡΠ°ΠΉΠ» table.txt Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ ΡΠΆΠ°ΡΠΈΡ:
01110
00
A010
E1111
I110
S10
T0110
U01111
Y1110
ΠΠ°ΠΏΠΈΡΡ ΡΠ°Π±Π»ΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ ‘ΡΠΈΠΌΠ²ΠΎΠ»’Β«ΠΊΠΎΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π°Β». ΠΠΎΡΠ΅ΠΌΡ 01110 Π±Π΅Π· ΡΠΈΠΌΠ²ΠΎΠ»Π°? ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΎΠ½ Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ, ΠΏΡΠΎΡΡΠΎ ΡΡΠ΅Π΄ΡΡΠ²Π° java, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΌΠ½ΠΎΠΉ ΠΏΡΠΈ Π²ΡΠ²ΠΎΠ΄Π΅ Π² ΡΠ°ΠΉΠ», ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ β ‘n’ -ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΡΡ Π² ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡΡ ΡΡΡΠΎΠΊΡ(ΠΊΠ°ΠΊ Π±Ρ ΡΡΠΎ Π³Π»ΡΠΏΠΎ Π½Π΅ Π·Π²ΡΡΠ°Π»ΠΎ). ΠΠΎΡΡΠΎΠΌΡ ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° ΡΠ²Π΅ΡΡ Ρ ΠΈ Π΅ΡΡΡ ΡΠΈΠΌΠ²ΠΎΠ» Π΄Π»Ρ ΠΊΠΎΠ΄Π° 01110. ΠΠ»Ρ ΠΊΠΎΠ΄Π° 00 ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ±Π΅Π» Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΡΠΎΠΊΠΈ. Π‘ΡΠ°Π·Ρ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ Π½Π°ΡΠ΅ΠΌΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ Ρ Π°Π½Π°ΡΡΠΎΡ ΡΠΏΠΎΡΠΎΠ± Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΡΠ΅Π½Π΄ΠΎΠ²Π°ΡΡ Π½Π° ΡΠ°ΠΌΡΠΉ Π½Π΅ΡΠ°ΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ. ΠΠΎ ΠΎΠ½ ΠΏΡΠΎΡΡ Π΄Π»Ρ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π‘ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ΠΌ Π²ΡΡΠ»ΡΡΠ°Ρ ΠΠ°ΡΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΌΠ΅Ρ ΡΡΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ. ΠΡΠΏΠΎΠΌΠ½ΠΈΠΌ, ΠΊΠ°ΠΊΠΈΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ ΠΌΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠ²Π°Π»ΠΈΡΡ, ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ:
ΠΠΈ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠ΄ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡΠΎΠΌ Π΄ΡΡΠ³ΠΎΠ³ΠΎ
ΠΠΎΡ ΡΡΡ-ΡΠΎ ΠΎΠ½ΠΎ ΠΈ ΠΈΠ³ΡΠ°Π΅Ρ ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡΡΡ ΡΠΎΠ»Ρ. ΠΡ ΡΠΈΡΠ°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΈΡ Π·Π° Π±ΠΈΡΠΎΠΌ ΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½Π°Ρ ΡΡΡΠΎΠΊΠ° d, ΡΠΎΡΡΠΎΡΡΠ°Ρ ΠΈΠ· ΠΏΡΠΎΡΡΠ΅Π½Π½ΡΡ Π±ΠΈΡΠΎΠ², ΡΠΎΠ²ΠΏΠ°Π΄Π°Π΅Ρ Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΎΠΉ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΠΈΠΌΠ²ΠΎΠ»Ρ character, ΠΌΡ ΡΡΠ°Π·Ρ Π·Π½Π°Π΅ΠΌ ΡΡΠΎ Π±ΡΠ» Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ ΡΠΈΠΌΠ²ΠΎΠ» character (ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ½!). ΠΠ°Π»Π΅Π΅ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ character Π² Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ(ΡΡΡΠΎΠΊΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΡΡ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅), ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ d, ΠΈ ΡΠΈΡΠ°Π΅ΠΌ Π΄Π°Π»ΡΡΠ΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ°ΠΉΠ».
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
ΠΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ½ΠΈΠΆΠ°ΡΡ ΠΌΠΎΠΉ ΠΊΠΎΠ΄ ΠΏΠΈΡΠ°ΡΡ Π°ΡΡ ΠΈΠ²Π°ΡΠΎΡ. ΠΠ°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ Compressor.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ Π½Π°ΡΠ°Π»Π°. ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΏΠΈΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡ Node:
public class Node {
private int frequence;//ΡΠ°ΡΡΠΎΡΠ°
private char letter;//Π±ΡΠΊΠ²Π°
private Node leftChild;//Π»Π΅Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ
private Node rightChild;//ΠΏΡΠ°Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ
public Node(char letter, int frequence) { //ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ
this.letter = letter;
this.frequence = frequence;
}
public Node() {}//ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ° ΠΊΠΎΠ½ΡΡΡΡΡΠΎΡΠ° Π΄Π»Ρ Π±Π΅Π·ΡΠΌΡΠ½Π½ΡΡ
ΡΠ·Π»ΠΎΠ²(ΡΠΌ. Π²ΡΡΠ΅ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ ΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΠΈ Π΄Π΅ΡΠ΅Π²Π° Π₯Π°ΡΡΠΌΠ°Π½Π°)
public void addChild(Node newNode) {//Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠ°
if (leftChild == null)//Π΅ΡΠ»ΠΈ Π»Π΅Π²ΡΠΉ ΠΏΡΡΡΠΎΠΉ=> ΠΏΡΠ°Π²ΡΠΉ ΡΠΎΠΆΠ΅=> Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ Π² Π»Π΅Π²ΡΠΉ
leftChild = newNode;
else {
if (leftChild.getFrequence() <= newNode.getFrequence()) //Π² ΠΎΠ±ΡΠ΅ΠΌ, Π»Π΅Π²ΡΠΌ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠΌ
rightChild = newNode;//ΡΡΠ°Π½Π΅Ρ ΡΠΎΡ, Ρ ΠΊΠΎΠ³ΠΎ ΠΌΠ΅Π½ΡΡΠ΅ ΡΠ°ΡΡΠΎΡΠ°
else {
rightChild = leftChild;
leftChild = newNode;
}
}
frequence += newNode.getFrequence();//ΠΈΡΠΎΠ³ΠΎΠ²Π°Ρ ΡΠ°ΡΡΠΎΡΠ°
}
public Node getLeftChild() {
return leftChild;
}
public Node getRightChild() {
return rightChild;
}
public int getFrequence() {
return frequence;
}
public char getLetter() {
return letter;
}
public boolean isLeaf() {//ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π»ΠΈΡΡ
return leftChild == null && rightChild == null;
}
}
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π΅ΡΠ΅Π²ΡΠ΅:
class BinaryTree {
private Node root;
public BinaryTree() {
root = new Node();
}
public BinaryTree(Node root) {
this.root = root;
}
public int getFrequence() {
return root.getFrequence();
}
public Node getRoot() {
return root;
}
}
ΠΡΠΈΠΎΡΠΈΡΠ΅ΡΠ½Π°Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ:
import java.util.ArrayList;//Π΄Π°-Π΄Π°, ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΡΠ΄Π΅Ρ Π½Π° Π±Π°Π·Π΅ ΡΠΏΠΈΡΠΊΠ°
class PriorityQueue {
private ArrayList<BinaryTree> data;//ΡΠΏΠΈΡΠΎΠΊ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ
private int nElems;//ΠΊΠΎΠ»-Π²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ
public PriorityQueue() {
data = new ArrayList<BinaryTree>();
nElems = 0;
}
public void insert(BinaryTree newTree) {//Π²ΡΡΠ°Π²ΠΊΠ°
if (nElems == 0)
data.add(newTree);
else {
for (int i = 0; i < nElems; i++) {
if (data.get(i).getFrequence() > newTree.getFrequence()) {//Π΅ΡΠ»ΠΈ ΡΠ°ΡΡΠΎΡΠ° Π²ΡΡΠ°Π²Π»ΡΠ΅ΠΌΠΎΠ³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΌΠ΅Π½ΡΡΠ΅
data.add(i, newTree);//ΡΠ΅ΠΌ ΡΠ°ΡΡ. ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ, ΡΠΎ cΠ΄Π²ΠΈΠ³Π°Π΅ΠΌ Π²ΡΠ΅ Π΄Π΅ΡΠ΅Π²ΡΡ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡΡ
ΡΠΏΡΠ°Π²Π° Π½Π° 1 ΡΡΠ΅ΠΉΠΊΡ
break;//Π·Π°ΡΠ΅ΠΌ ΡΡΠ°Π²ΠΈΠΌ Π½ΠΎΠ²ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ Π½Π° ΠΏΠΎΠ·ΠΈΡΠΈΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ
}
if (i == nElems - 1)
data.add(newTree);
}
}
nElems++;//ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ ΠΊΠΎΠ»-Π²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π° 1
}
public BinaryTree remove() {//ΡΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ
BinaryTree tmp = data.get(0);//ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ΄Π°Π»ΡΠ΅ΠΌΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
data.remove(0);//ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ΄Π°Π»ΡΠ΅ΠΌ
nElems--;//ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΠΊΠΎΠ»-Π²ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π½Π° 1
return tmp;//Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ(ΡΠ»Π΅ΠΌΠ΅Π½Ρ Ρ Π½Π°ΠΈΠΌΠ΅Π½ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ)
}
}
ΠΠ»Π°ΡΡ, ΡΠΎΠ·Π΄Π°ΡΡΠΈΠΉ Π΄Π΅ΡΠ΅Π²ΠΎ Π₯Π°ΡΡΠΌΠ°Π½Π°:
public class HuffmanTree {
private final byte ENCODING_TABLE_SIZE = 127;//Π΄Π»ΠΈΠ½Π° ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ
private String myString;//ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
private BinaryTree huffmanTree;//Π΄Π΅ΡΠ΅Π²ΠΎ Π₯Π°ΡΡΠΌΠ°Π½Π°
private int[] freqArray;//ΡΠ°ΡΡΠΎΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°
private String[] encodingArray;//ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°
//----------------constructor----------------------
public HuffmanTree(String newString) {
myString = newString;
freqArray = new int[ENCODING_TABLE_SIZE];
fillFrequenceArray();
huffmanTree = getHuffmanTree();
encodingArray = new String[ENCODING_TABLE_SIZE];
fillEncodingArray(huffmanTree.getRoot(), "", "");
}
//--------------------frequence array------------------------
private void fillFrequenceArray() {
for (int i = 0; i < myString.length(); i++) {
freqArray[(int)myString.charAt(i)]++;
}
}
public int[] getFrequenceArray() {
return freqArray;
}
//------------------------huffman tree creation------------------
private BinaryTree getHuffmanTree() {
PriorityQueue pq = new PriorityQueue();
//Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ Π²ΡΡΠ΅
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {//Π΅ΡΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π² ΡΡΡΠΎΠΊΠ΅
Node newNode = new Node((char) i, freqArray[i]);//ΡΠΎ ΡΠΎΠ·Π΄Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ Node
BinaryTree newTree = new BinaryTree(newNode);//Π° Π΄Π»Ρ Node ΡΠΎΠ·Π΄Π°ΡΡ BinaryTree
pq.insert(newTree);//Π²ΡΡΠ°Π²ΠΈΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ
}
}
while (true) {
BinaryTree tree1 = pq.remove();//ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ.
try {
BinaryTree tree2 = pq.remove();//ΠΈΠ·Π²Π»Π΅ΡΡ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π²ΡΠΎΡΠΎΠ΅ Π΄Π΅ΡΠ΅Π²ΠΎ
Node newNode = new Node();//ΡΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ Node
newNode.addChild(tree1.getRoot());//ΡΠ΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ Π΄Π²Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½Π½ΡΡ
Π΄Π΅ΡΠ΅Π²Π°
newNode.addChild(tree2.getRoot());
pq.insert(new BinaryTree(newNode);
} catch (IndexOutOfBoundsException e) {//ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΎΠ΄Π½ΠΎ Π΄Π΅ΡΠ΅Π²ΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ
return tree1;
}
}
}
public BinaryTree getTree() {
return huffmanTree;
}
//-------------------encoding array------------------
void fillEncodingArray(Node node, String codeBefore, String direction) {//Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΡΡ ΡΠ°Π±Π»ΠΈΡΡ
if (node.isLeaf()) {
encodingArray[(int)node.getLetter()] = codeBefore + direction;
} else {
fillEncodingArray(node.getLeftChild(), codeBefore + direction, "0");
fillEncodingArray(node.getRightChild(), codeBefore + direction, "1");
}
}
String[] getEncodingArray() {
return encodingArray;
}
public void displayEncodingArray() {//Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
fillEncodingArray(huffmanTree.getRoot(), "", "");
System.out.println("======================Encoding table====================");
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {
System.out.print((char)i + " ");
System.out.println(encodingArray[i]);
}
}
System.out.println("========================================================");
}
//-----------------------------------------------------
String getOriginalString() {
return myString;
}
}
ΠΠ»Π°ΡΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ/Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ:
public class HuffmanOperator {
private final byte ENCODING_TABLE_SIZE = 127;//Π΄Π»ΠΈΠ½Π° ΡΠ°Π±Π»ΠΈΡΡ
private HuffmanTree mainHuffmanTree;//Π΄Π΅ΡΠ΅Π²ΠΎ Π₯Π°ΡΡΠΌΠ°Π½Π° (ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΡΠΆΠ°ΡΠΈΡ)
private String myString;//ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
private int[] freqArray;//ΡΠ°ΡΡΠΎΡΠ°Π½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°
private String[] encodingArray;//ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°
private double ratio;//ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ
public HuffmanOperator(HuffmanTree MainHuffmanTree) {//for compress
this.mainHuffmanTree = MainHuffmanTree;
myString = mainHuffmanTree.getOriginalString();
encodingArray = mainHuffmanTree.getEncodingArray();
freqArray = mainHuffmanTree.getFrequenceArray();
}
public HuffmanOperator() {}//for extract;
//---------------------------------------compression-----------------------------------------------------------
private String getCompressedString() {
String compressed = "";
String intermidiate = "";//ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½Π°Ρ ΡΡΡΠΎΠΊΠ°(Π±Π΅Π· Π΄ΠΎΠ±Π°Π²ΠΎΡΠ½ΡΡ
Π½ΡΠ»Π΅ΠΉ)
//System.out.println("=============================Compression=======================");
//displayEncodingArray();
for (int i = 0; i < myString.length(); i++) {
intermidiate += encodingArray[myString.charAt(i)];
}
//ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ Π±ΠΈΡ Π² ΡΠ°ΠΉΠ». ΠΠΎΡΡΠΎΠΌΡ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π΄Π»ΠΈΠ½Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΡΠ°ΡΠ½ΠΎΠΉ 8=>
//Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΡΠ»ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ(ΠΌΠΎΠΆΠ½ΠΎ 1, Π½Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ)
byte counter = 0;//ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
Π² ΠΊΠΎΠ½Π΅Ρ Π½ΡΠ»Π΅ΠΉ (Π±Π°ΠΉΡΠ° Π² ΠΏΠΎΠ»Π½Π΅ Ρ
Π²Π°ΡΠΈΡ: 0<=counter<8<127)
for (int length = intermidiate.length(), delta = 8 - length % 8;
counter < delta ; counter++) {//delta - ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
Π½ΡΠ»Π΅ΠΉ
intermidiate += "0";
}
//ΡΠΊΠ»Π΅ΠΈΡΡ ΠΊΠΎΠ»-Π²ΠΎ Π΄ΠΎΠ±Π°Π²ΠΎΡΠ½ΡΡ
Π½ΡΠ»Π΅ΠΉ Π² Π±ΠΈΠ½Π°ΡΠ½ΠΎΠΌ ΠΏΡΠ΅Π΄Π°ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΈ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ
compressed = String.format("%8s", Integer.toBinaryString(counter & 0xff)).replace(" ", "0") + intermidiate;
//ΠΈΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ
setCompressionRatio();
//System.out.println("===============================================================");
return compressed;
}
private void setCompressionRatio() {//ΠΏΠΎΡΡΠΈΡΠ°ΡΡ ΠΈΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ
double sumA = 0, sumB = 0;//A-the original sum
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
if (freqArray[i] != 0) {
sumA += 8 * freqArray[i];
sumB += encodingArray[i].length() * freqArray[i];
}
}
ratio = sumA / sumB;
}
public byte[] getBytedMsg() {//final compression
StringBuilder compressedString = new StringBuilder(getCompressedString());
byte[] compressedBytes = new byte[compressedString.length() / 8];
for (int i = 0; i < compressedBytes.length; i++) {
compressedBytes[i] = (byte) Integer.parseInt(compressedString.substring(i * 8, (i + 1) * 8), 2);
}
return compressedBytes;
}
//---------------------------------------end of compression----------------------------------------------------------------
//------------------------------------------------------------extract-----------------------------------------------------
public String extract(String compressed, String[] newEncodingArray) {
String decompressed = "";
String current = "";
String delta = "";
encodingArray = newEncodingArray;
//displayEncodingArray();
//ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ»-Π²ΠΎ Π²ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ
Π½ΡΠ»Π΅ΠΉ
for (int i = 0; i < 8; i++)
delta += compressed.charAt(i);
int ADDED_ZEROES = Integer.parseInt(delta, 2);
for (int i = 8, l = compressed.length() - ADDED_ZEROES; i < l; i++) {
//i = 8, Ρ.ΠΊ. ΠΏΠ΅ΡΠ²ΡΠΌ Π±Π°ΠΉΡΠΎΠΌ Ρ Π½Π°Ρ ΠΈΠ΄Π΅Ρ ΠΊΠΎΠ»-Π²ΠΎ Π²ΡΡΠ°Π²Π»Π΅Π½Π½ΡΡ
Π½ΡΠ»Π΅ΠΉ
current += compressed.charAt(i);
for (int j = 0; j < ENCODING_TABLE_SIZE; j++) {
if (current.equals(encodingArray[j])) {//Π΅ΡΠ»ΠΈ ΡΠΎΠ²ΠΏΠ°Π»ΠΎ
decompressed += (char)j;//ΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½Ρ
current = "";//ΠΈ ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΡΡ ΡΡΡΠΎΠΊΡ
}
}
}
return decompressed;
}
public String getEncodingTable() {
String enc = "";
for (int i = 0; i < encodingArray.length; i++) {
if (freqArray[i] != 0)
enc += (char)i + encodingArray[i] + 'n';
}
return enc;
}
public double getCompressionRatio() {
return ratio;
}
public void displayEncodingArray() {//Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ
System.out.println("======================Encoding table====================");
for (int i = 0; i < ENCODING_TABLE_SIZE; i++) {
//if (freqArray[i] != 0) {
System.out.print((char)i + " ");
System.out.println(encodingArray[i]);
//}
}
System.out.println("========================================================");
}
}
ΠΠ»Π°ΡΡ, ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡΠΈΠΉ Π·Π°ΠΏΠΈΡΡ Π² ΡΠ°ΠΉΠ»:
import java.io.File;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Closeable;
public class FileOutputHelper implements Closeable {
private File outputFile;
private FileOutputStream fileOutputStream;
public FileOutputHelper(File file) throws FileNotFoundException {
outputFile = file;
fileOutputStream = new FileOutputStream(outputFile);
}
public void writeByte(byte msg) throws IOException {
fileOutputStream.write(msg);
}
public void writeBytes(byte[] msg) throws IOException {
fileOutputStream.write(msg);
}
public void writeString(String msg) {
try (PrintWriter pw = new PrintWriter(outputFile)) {
pw.write(msg);
} catch (FileNotFoundException e) {
System.out.println("ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΠΏΡΡΡ, ΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ!");
}
}
@Override
public void close() throws IOException {
fileOutputStream.close();
}
public void finalize() throws IOException {
close();
}
}
ΠΠ»Π°ΡΡ, ΠΎΠ±Π»Π΅Π³ΡΠ°ΡΡΠΈΠΉ ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΡΠ°ΠΉΠ»Π°:
import java.io.FileInputStream;
import java.io.EOFException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
public class FileInputHelper implements Closeable {
private FileInputStream fileInputStream;
private BufferedReader fileBufferedReader;
public FileInputHelper(File file) throws IOException {
fileInputStream = new FileInputStream(file);
fileBufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
}
public byte readByte() throws IOException {
int cur = fileInputStream.read();
if (cur == -1)//Π΅ΡΠ»ΠΈ Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΡΡ ΡΠ°ΠΉΠ»
throw new EOFException();
return (byte)cur;
}
public String readLine() throws IOException {
return fileBufferedReader.readLine();
}
@Override
public void close() throws IOException{
fileInputStream.close();
}
}
ΠΡ, ΠΈ Π³Π»Π°Π²Π½ΡΠΉ ΠΊΠ»Π°ΡΡ:
import java.io.File;
import java.nio.charset.MalformedInputException;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.NoSuchFileException;
import java.nio.file.Paths;
import java.util.List;
import java.io.EOFException;
public class Main {
private static final byte ENCODING_TABLE_SIZE = 127;
public static void main(String[] args) throws IOException {
try {//ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
if (args[0].equals("--compress") || args[0].equals("-c"))
compress(args[1]);
else if ((args[0].equals("--extract") || args[0].equals("-x"))
&& (args[2].equals("--table") || args[2].equals("-t"))) {
extract(args[1], args[3]);
}
else
throw new IllegalArgumentException();
} catch (ArrayIndexOutOfBoundsException | IllegalArgumentException e) {
System.out.println("ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ Π²Π²ΠΎΠ΄Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ");
System.out.println("Π§ΠΈΡΠ°ΠΉΡΠ΅ Readme.txt");
e.printStackTrace();
}
}
public static void compress(String stringPath) throws IOException {
List<String> stringList;
File inputFile = new File(stringPath);
String s = "";
File compressedFile, table;
try {
stringList = Files.readAllLines(Paths.get(inputFile.getAbsolutePath()));
} catch (NoSuchFileException e) {
System.out.println("ΠΠ΅Π²Π΅ΡΠ½ΡΠΉ ΠΏΡΡΡ, ΠΈΠ»ΠΈ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ!");
return;
} catch (MalformedInputException e) {
System.out.println("Π’Π΅ΠΊΡΡΠ°Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° ΡΠ°ΠΉΠ»Π° Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ");
return;
}
for (String item : stringList) {
s += item;
s += 'n';
}
HuffmanOperator operator = new HuffmanOperator(new HuffmanTree(s));
compressedFile = new File(inputFile.getAbsolutePath() + ".cpr");
compressedFile.createNewFile();
try (FileOutputHelper fo = new FileOutputHelper(compressedFile)) {
fo.writeBytes(operator.getBytedMsg());
}
//create file with encoding table:
table = new File(inputFile.getAbsolutePath() + ".table.txt");
table.createNewFile();
try (FileOutputHelper fo = new FileOutputHelper(table)) {
fo.writeString(operator.getEncodingTable());
}
System.out.println("ΠΡΡΡ ΠΊ ΡΠΆΠ°ΡΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ: " + compressedFile.getAbsolutePath());
System.out.println("ΠΡΡΡ ΠΊ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ " + table.getAbsolutePath());
System.out.println("ΠΠ΅Π· ΡΠ°Π±Π»ΠΈΡΡ ΡΠ°ΠΉΠ» Π±ΡΠ΄Π΅Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΡ!");
double idealRatio = Math.round(operator.getCompressionRatio() * 100) / (double) 100;//ΠΈΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ
double realRatio = Math.round((double) inputFile.length()
/ ((double) compressedFile.length() + (double) table.length()) * 100) / (double)100;//Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ
System.out.println("ΠΠ΄Π΅Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ ΡΠ°Π²Π΅Π½ " + idealRatio);
System.out.println("ΠΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ Ρ ΡΡΠ΅ΡΠΎΠΌ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ " + realRatio);
}
public static void extract(String filePath, String tablePath) throws FileNotFoundException, IOException {
HuffmanOperator operator = new HuffmanOperator();
File compressedFile = new File(filePath),
tableFile = new File(tablePath),
extractedFile = new File(filePath + ".xtr");
String compressed = "";
String[] encodingArray = new String[ENCODING_TABLE_SIZE];
//read compressed file
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!check here:
try (FileInputHelper fi = new FileInputHelper(compressedFile)) {
byte b;
while (true) {
b = fi.readByte();//method returns EOFException
compressed += String.format("%8s", Integer.toBinaryString(b & 0xff)).replace(" ", "0");
}
} catch (EOFException e) {
}
//--------------------
//read encoding table:
try (FileInputHelper fi = new FileInputHelper(tableFile)) {
fi.readLine();//skip first empty string
encodingArray[(byte)'n'] = fi.readLine();//read code for 'n'
while (true) {
String s = fi.readLine();
if (s == null)
throw new EOFException();
encodingArray[(byte)s.charAt(0)] = s.substring(1, s.length());
}
} catch (EOFException ignore) {}
extractedFile.createNewFile();
//extract:
try (FileOutputHelper fo = new FileOutputHelper(extractedFile)) {
fo.writeString(operator.extract(compressed, encodingArray));
}
System.out.println("ΠΡΡΡ ΠΊ ΡΠ°ΡΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ " + extractedFile.getAbsolutePath());
}
}
Π€Π°ΠΉΠ» Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΠΌΠΈ readme.txt ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ Π²Π°ΠΌ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ°ΠΌΠΈΠΌ π
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°Π²Π΅ΡΠ½ΠΎΠ΅, ΡΡΠΎ Π²ΡΠ΅ ΡΡΠΎ Ρ Ρ ΠΎΡΠ΅Π» ΡΠΊΠ°Π·Π°ΡΡ. ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΡΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρ ΠΌΠΎΠ΅ΠΉ Π½Π΅ΠΊΠΎΠΌΠΏΠ΅ΡΠ΅Π½ΡΠ½ΠΎΡΡΠΈ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅, Π°Π»Π³ΠΎΡΠΈΡΠΌΠ΅, Π²ΠΎΠΎΠ±ΡΠ΅ Π»ΡΠ±ΠΎΠΉ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ, ΡΠΎ ΡΠΌΠ΅Π»ΠΎ ΠΏΠΈΡΠΈΡΠ΅. ΠΡΠ»ΠΈ Ρ ΡΡΠΎ-ΡΠΎ Π½Π΅Π΄ΠΎΠΎΠ±ΡΡΡΠ½ΠΈΠ», ΡΠΎΠΆΠ΅ ΠΏΠΈΡΠΈΡΠ΅. ΠΡΠ΄Ρ ΡΠ°Π΄ ΡΡΠ»ΡΡΠ°ΡΡ Π²Π°Ρ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ !
P.S.
ΠΠ°-Π΄Π°, Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π·Π΄Π΅ΡΡ, Π²Π΅Π΄Ρ Ρ Π½Π΅ Π·Π°Π±ΡΠ» ΠΏΡΠΎ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ. ΠΠ»Ρ ΡΡΡΠΎΠΊΠΈ s1 ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° Π²Π΅ΡΠΈΡ 48 Π±Π°ΠΉΡ β Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»ΡΡΠ΅ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π΄Π° ΠΈ ΠΏΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΎΡΠ½ΡΠ΅ Π½ΡΠ»ΠΈ Π½Π΅ Π·Π°Π±ΡΠ»ΠΈ(ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΡ
Π½ΡΠ»Π΅ΠΉ ΡΠ°Π²Π½ΠΎ 7)=> ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ: 176/(65 + 48*8 + 7)=0.38. ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠΆΠ΅ ΡΡΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠ»ΠΈ, ΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ ΠΏΠΎ Π»ΠΈΡΡ Π²Ρ ΠΌΠΎΠ»ΠΎΠ΄Π΅Ρ. ΠΠ°, ΡΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π±ΡΠ΄Π΅Ρ ΠΊΡΠ°ΠΉΠ½Π΅ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠΉ Π΄Π»Ρ ΠΌΠ°Π»ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠΎ ΡΡΠΎ ΠΆΠ΅ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ? Π Π°Π·ΠΌΠ΅ΡΡ ΡΠ°ΠΉΠ»Π° Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠ΅Π²ΡΡΠ°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ. ΠΠΎΡ Π·Π΄Π΅ΡΡ-ΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΊΠ°ΠΊ-Π½Π°Π΄ΠΎ! ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com