แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž˜แžฝแž™แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman

แž’แžถแžแžป

แž“แŸ…แž€แŸ’แž“แžปแž„แžขแžแŸ’แžแž”แž‘แž“แŸแŸ‡ แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman แžŠแŸแž›แŸ’แž”แžธ แž€แŸแžŠแžผแž…แž‡แžถแž€แž˜แŸ’แž˜แžœแžทแž’แžธแžšแž”แžŸแŸ‹แžœแžถแž€แŸ’แž“แžปแž„แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แŸ”

แž‡แžถแž›แž‘แŸ’แž’แž•แž›แž™แžพแž„แž“แžนแž„แžŸแžšแžŸแŸแžšแž”แŸแžŽแŸ’แžŽแžŸแžถแžšแžŸแžถแž˜แž‰แŸ’แž‰แŸ” แž“แŸแŸ‡โ€‹แž”แžถแž“โ€‹แžšแžฝแž…โ€‹แž‘แŸ…โ€‹แž แžพแž™แŸ” แžขแžแŸ’แžแž”แž‘แžขแŸ†แž–แžธ Habreแž”แŸ‰แžปแž“แŸ’แžแŸ‚แžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž‡แžถแž€แŸ‹แžŸแŸ’แžแŸ‚แž„แŸ” แžŸแž˜แŸ’แž—แžถแžšแŸˆแž‘แŸ’แžšแžนแžŸแŸ’แžแžธแž“แŸƒแž€แžถแžšแž”แŸ’แžšแž€แžถแžŸแž”แž…แŸ’แž…แžปแž”แŸ’แž”แž“แŸ’แž“แž‚แžบแž™แž€แž…แŸแž‰แž–แžธแž˜แŸแžšแŸ€แž“แžœแžทแž‘แŸ’แž™แžถแžŸแžถแžŸแŸ’แžแŸ’แžšแž€แžปแŸ†แž–แŸ’แž™แžผแž‘แŸแžšแžšแž”แžŸแŸ‹แžŸแžถแž›แžถ แž“แžทแž„แžŸแŸ€แžœแž—แŸ…แžšแž”แžŸแŸ‹ Robert Laforet "Data Structures and Algorithms in Java"แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แžขแŸ’แžœแžธแž‚แŸ’แžšแž”แŸ‹แž™แŸ‰แžถแž„แž‚แžบแžŸแŸ’แžแžทแžแž“แŸ…แž€แŸ’แžšแŸ„แž˜แž€แžถแžšแž€แžถแžแŸ‹!

แž€แžถแžšแž†แŸ’แž›แžปแŸ‡แž”แž‰แŸ’แž…แžถแŸ†แž„แžแžทแž…แžแžฝแž…

แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžšแžขแžแŸ’แžแž”แž‘แž’แž˜แŸ’แž˜แžแžถ แžแžฝแžขแž€แŸ’แžŸแžšแž˜แžฝแž™แžแŸ’แžšแžผแžœแž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแžŠแŸ„แž™ 8 แž”แŸŠแžธแž (แž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠ ASCII) แžฌ 16 (แž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠแž™แžผแž“แžธแž€แžผแžŠ) แŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹ แž™แžพแž„แž“แžนแž„แž–แžทแž…แžถแžšแžŽแžถแž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠ ASCII แŸ” แžงแž‘แžถแž แžšแžŽแŸ แž™แž€ string s1 = "SUSIE SAYS IT IS EASYn" แŸ” แžŸแžšแžปแž”แž˜แž€ แž˜แžถแž“แžแžฝแžขแž€แŸ’แžŸแžšแž…แŸ†แž“แžฝแž“ 22 แž“แŸ…แž€แŸ’แž“แžปแž„แž”แž“แŸ’แž‘แžถแžแŸ‹ แžšแžฝแž˜แž‘แžถแŸ†แž„แžŠแž€แžƒแŸ’แž›แžถ แž“แžทแž„แžแžฝแžขแž€แŸ’แžŸแžšแž”แž“แŸ’แž‘แžถแžแŸ‹แžแŸ’แž˜แžธ - 'n' แŸ” แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แž˜แžถแž“แž”แž“แŸ’แž‘แžถแžแŸ‹แž“แŸแŸ‡แž“แžนแž„แž˜แžถแž“แž‘แž˜แŸ’แž„แž“แŸ‹ 22 * โ€‹โ€‹8 = 176 แž”แŸŠแžธแžแŸ” แžŸแŸ†แžŽแžฝแžšแž€แžพแžแžกแžพแž„แž—แŸ’แž›แžถแž˜แŸ—แŸ– แžแžพแžœแžถแžŸแž˜แž แŸแžแžปแž•แž›แž‘แŸแž€แŸ’แž“แžปแž„แž€แžถแžšแž”แŸ’แžšแžพ 8 แž”แŸŠแžธแž แžŠแžพแž˜แŸ’แž”แžธแžขแŸŠแžทแž“แž€แžผแžŠแžแžฝแžขแž€แŸ’แžŸแžš 1? แž™แžพแž„แž˜แžทแž“แž”แŸ’แžšแžพแžแžฝแžขแž€แŸ’แžŸแžš ASCII แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž‘แŸแŸ” แž‘แŸ„แŸ‡แž”แžธแž‡แžถแž–แžฝแž€แž‚แŸแž˜แžถแž“แž€แŸแžŠแŸ„แž™ แžœแžถแž“แžนแž„แžŸแž˜แž แŸแžแžปแž•แž›แž‡แžถแž„แž€แŸ’แž“แžปแž„แž€แžถแžšแž•แŸ’แžแž›แŸ‹แžขแž€แŸ’แžŸแžšแž‰แžนแž€แž‰แžถแž”แŸ‹แž”แŸ†แž•แžปแž - S - แž›แŸแžแž€แžผแžŠแžแŸ’แž›แžธแž”แŸ†แž•แžปแžแžŠแŸ‚แž›แžขแžถแž…แž’แŸ’แžœแžพแž‘แŸ…แž”แžถแž“ แž แžพแž™แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžขแž€แŸ’แžŸแžšแžŠแŸแž€แž˜แŸ’แžšแž”แŸ†แž•แžปแž - T (แžฌ U แžฌ 'n') - แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แž›แŸแžแž€แžผแžŠแž–แžทแžแž”แŸ’แžšแžถแž€แžŠแž‡แžถแž„แŸ” แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ HuffmanแŸ– แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžŸแŸ’แžœแŸ‚แž„แžšแž€แž‡แž˜แŸ’แžšแžพแžŸแž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠแž›แŸ’แžขแž”แŸ†แž•แžปแž แžŠแŸ‚แž›แžฏแž€แžŸแžถแžšแž“แžนแž„แž˜แžถแž“แž‘แž˜แŸ’แž„แž“แŸ‹แžขแž”แŸ’แž”แž”แžšแž˜แžถแŸ” แžœแžถแž‡แžถแžšแžฟแž„แž’แž˜แŸ’แž˜แžแžถแž‘แŸแžŠแŸ‚แž›แžแžฝแžขแž€แŸ’แžŸแžšแž•แŸ’แžŸแŸแž„แž‚แŸ’แž“แžถแž“แžนแž„แž˜แžถแž“แž”แŸ’แžšแžœแŸ‚แž„แž€แžผแžŠแžแžปแžŸแŸ—แž‚แŸ’แž“แžถ - แž“แŸแŸ‡แž‚แžบแž‡แžถแž˜แžผแž›แžŠแŸ’แž‹แžถแž“แž“แŸƒแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แŸ”

ะพะดะธั€ะพะฒะฐะฝะธะต

แž แŸแžแžปแžขแŸ’แžœแžธแž˜แžทแž“แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แžแžฝแžขแž€แŸ’แžŸแžš 'S' แž€แžผแžŠแžงแž‘แžถแž แžšแžŽแŸ 1 แž”แŸŠแžธแžแžœแŸ‚แž„: 0 แžฌ 1. แžขแž“แžปแž‰แŸ’แž‰แžถแžแžฑแŸ’แž™แžœแžถแž‡แžถ 1. แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แžแžฝแžขแž€แŸ’แžŸแžšแžŠแŸ‚แž›แž€แžพแžแžกแžพแž„แž…แŸ’แžšแžพแž“แž”แŸ†แž•แžปแžแž‘แžธแž–แžธแžš - ' ' (แžŠแž€แžƒแŸ’แž›แžถ) - แž™แžพแž„แž“แžนแž„แž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™ 0 แŸ” แžŸแŸ’แžšแž˜แŸƒแž˜แžพแž›แžขแŸ’แž“แž€แž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜ แžŒแžทแž€แžผแžŠแžŸแžถแžšแžšแž”แžŸแŸ‹แžขแŸ’แž“แž€ - แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแžŠแŸ‚แž›แž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠ s1 - แž แžพแž™แžขแŸ’แž“แž€แžƒแžพแž‰แžแžถแž€แžผแžŠแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ„แž™แž›แŸแž 1แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž’แŸ’แžœแžพแŸ– แžแžพแžœแžถแž‡แžถแžแžฝแžขแž€แŸ’แžŸแžš S แžฌแžœแžถแž‡แžถแžแžฝแžขแž€แŸ’แžŸแžšแž•แŸ’แžŸแŸแž„แž‘แŸ€แžแžŠแžผแž…แž‡แžถ A? แžŠแžผแž…แŸ’แž“แŸแŸ‡แž…แŸ’แž”แžถแž”แŸ‹แžŸแŸ†แžแžถแž“แŸ‹แž˜แžฝแž™แž€แžพแžแžกแžพแž„แŸ–

แž‚แŸ’แž˜แžถแž“แž›แŸแžแž€แžผแžŠแžแŸ’แžšแžผแžœแžแŸ‚แž‡แžถแž”แžปแž–แŸ’แžœแž”แž‘แž“แŸƒแž˜แžฝแž™แž•แŸ’แžŸแŸแž„แž‘แŸ€แž

แž€แŸ’แž”แžฝแž“แž“แŸแŸ‡แž‚แžบแž‡แžถแž‚แž“แŸ’แž›แžนแŸ‡แž“แŸƒแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž€แžถแžšแž”แž„แŸ’แž€แžพแžแž€แžผแžŠแž…แžถแž”แŸ‹แž•แŸ’แžแžพแž˜แžŠแŸ„แž™แžแžถแžšแžถแž„แž”แŸ’แžšแŸแž€แž„แŸ‹ แžŠแŸ‚แž›แž”แž„แŸ’แž แžถแž‰แž–แžธแž”แŸ’แžšแŸแž€แž„แŸ‹ (แž…แŸ†แž“แžฝแž“แž“แŸƒแž€แžถแžšแž€แžพแžแžกแžพแž„) แž“แŸƒแž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแž“แžธแž˜แžฝแž™แŸ—แŸ–

แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž˜แžฝแž™แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman แžแžฝแžขแž€แŸ’แžŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžพแžแžกแžพแž„แž…แŸ’แžšแžพแž“แž”แŸ†แž•แžปแžแž‚แžฝแžšแžแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแžŠแŸ„แž™แžแžผแž…แž”แŸ†แž•แžปแžแŸ” แžขแžถแž… แž…แŸ†แž“แžฝแž“แž”แŸŠแžธแžแŸ” แžแŸ’แž‰แžปแŸ†แž“แžนแž„แž•แŸ’แžแž›แŸ‹แžงแž‘แžถแž แžšแžŽแŸแž˜แžฝแž™แž“แŸƒแžแžถแžšแžถแž„แž€แžผแžŠแžŠแŸ‚แž›แžขแžถแž…แž˜แžถแž“แŸ–

แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž˜แžฝแž™แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman แžŠแžผแž…แŸ’แž“แŸแŸ‡ แžŸแžถแžšแžŠแŸ‚แž›แž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแž“แžนแž„แž˜แžพแž›แž‘แŸ…แžŠแžผแž…แž“แŸแŸ‡แŸ–

10 01111 10 110 1111 00 10 010 1110 10 00 110 0110 00 110 10 00 1111 010 10 1110 01110

แžแŸ’แž‰แžปแŸ†แž”แžถแž“แž”แŸ†แž”แŸ‚แž€แž€แžผแžŠแž“แŸƒแžแžฝแžขแž€แŸ’แžŸแžšแž“แžธแž˜แžฝแž™แŸ—แžŠแŸ„แž™แžŠแž€แžƒแŸ’แž›แžถแŸ” แžœแžถแž“แžนแž„แž˜แžทแž“แž€แžพแžแžกแžพแž„แž“แŸ…แž€แŸ’แž“แžปแž„แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž แžถแž”แŸ‹แž‘แŸ!
แžŸแŸ†แžŽแžฝแžšแž€แžพแžแžกแžพแž„แŸ– แžแžพแžขแŸ’แž“แž€แžแŸ’แž˜แžธแžแŸ’แž˜แŸ„แž„แž“แŸแŸ‡แž”แž„แŸ’แž€แžพแžแž€แžผแžŠแžšแž”แŸ€แž”แž”แž„แŸ’แž€แžพแžแžแžถแžšแžถแž„แž€แžผแžŠแžŠแŸ„แž™แžšแž”แŸ€แž”แžŽแžถ? แž“แŸแŸ‡แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž—แžถแž€แŸ’แžŸแžถแžŠแžผแž…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ”

แž€แžถแžšแžŸแžถแž„แžŸแž„แŸ‹แžŠแžพแž˜แžˆแžพ Huffman

แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แžŠแžพแž˜แžˆแžพแžŸแŸ’แžœแŸ‚แž„แžšแž€แž”แŸ’แžšแž–แŸแž“แŸ’แž’แž‚แŸ„แž›แž–แžธแžšแž˜แž€แž‡แžฝแž™แžŸแž„แŸ’แž‚แŸ’แžšแŸ„แŸ‡แŸ” แž€แžปแŸ†แž”แžถแžšแž˜แŸ’แž— แžขแŸ’แž“แž€แž“แžนแž„แž˜แžทแž“แžแŸ’แžšแžผแžœแž€แžถแžšแž€แžถแžšแžŸแŸ’แžœแŸ‚แž„แžšแž€ แž”แž‰แŸ’แž…แžผแž› แž“แžทแž„แž›แžปแž”แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž“แŸ…แž‘แžธแž“แŸแŸ‡แž‘แŸแŸ” แž“แŸแŸ‡แž‚แžบแž‡แžถแžšแž…แž“แžถแžŸแž˜แŸ’แž–แŸแž“แŸ’แž’แžŠแžพแž˜แžˆแžพแž“แŸ…แž€แŸ’แž“แžปแž„ 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;
    }
    ...
}

แž“แŸแŸ‡แž˜แžทแž“แž˜แŸ‚แž“แž‡แžถแž›แŸแžแž€แžผแžŠแž–แŸแž‰แž›แŸแž‰แž‘แŸ แž›แŸแžแž€แžผแžŠแž–แŸแž‰แž›แŸแž‰แž“แžนแž„แž˜แžถแž“แž“แŸ…แžแžถแž„แž€แŸ’แžšแŸ„แž˜แŸ”

แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž€แžถแžšแž€แžŸแžถแž„แžŠแžพแž˜แžˆแžพแŸ–

  1. แž”แž„แŸ’แž€แžพแžแžœแžแŸ’แžแžป Node แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแžฝแžขแž€แŸ’แžŸแžšแž“แžธแž˜แžฝแž™แŸ—แž–แžธแžŸแžถแžš (แž”แž“แŸ’แž‘แžถแžแŸ‹ s1) แŸ” แž€แŸ’แž“แžปแž„แž€แžšแžŽแžธแžšแž”แžŸแŸ‹แž™แžพแž„แžœแžถแž“แžนแž„แž˜แžถแž“ 9 nodes ( Node objects ) แŸ” แžแŸ’แž“แžถแŸ†แž„แž“แžธแž˜แžฝแž™แŸ—แž˜แžถแž“แžœแžถแž›แž‘แžทแž“แŸ’แž“แž“แŸแž™แž–แžธแžšแŸ– แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถ แž“แžทแž„แž”แŸ’แžšแŸแž€แž„แŸ‹
  2. แž”แž„แŸ’แž€แžพแž Tree object (BinaryTree) แžŸแž˜แŸ’แžšแžถแž”แŸ‹ Node แž“แžธแž˜แžฝแž™แŸ—แŸ” แžแŸ’แž“แžถแŸ†แž„แž€แŸ’แž›แžถแž™แž‡แžถแžซแžŸแž“แŸƒแžŠแžพแž˜แžˆแžพแŸ”
  3. แž”แž‰แŸ’แž…แžผแž›แžŠแžพแž˜แžˆแžพแž‘แžถแŸ†แž„แž“แŸแŸ‡แž‘แŸ…แž€แŸ’แž“แžปแž„แž‡แžฝแžšแžขแžถแž‘แžทแž—แžถแž–แŸ” แž”แŸ’แžšแŸแž€แž„แŸ‹แž€แžถแž“แŸ‹แžแŸ‚แž‘แžถแž” แžขแžถแž‘แžทแž—แžถแž–แž€แžถแž“แŸ‹แžแŸ‚แžแŸ’แž–แžŸแŸ‹แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡แž“แŸ…แž–แŸแž›แžŸแŸ’แžšแž„แŸ‹แž…แŸแž‰ แž˜แŸ‚แž€แž’แžถแž„แžŠแŸ‚แž›แž˜แžถแž“แž”แŸ’แžšแŸแž€แž„แŸ‹แž‘แžถแž”แž”แŸ†แž•แžปแžแžแŸ‚แž„แžแŸ‚แžแŸ’แžšแžผแžœแž”แžถแž“แž‡แŸ’แžšแžพแžŸแžšแžพแžŸแŸ”

แž”แž“แŸ’แž‘แžถแž”แŸ‹โ€‹แž˜แž€ แžขแŸ’แž“แž€โ€‹แžแŸ’แžšแžผแžœโ€‹แž’แŸ’แžœแžพโ€‹แžŠแžผแž…โ€‹แžแžถแž„โ€‹แž€แŸ’แžšแŸ„แž˜แŸ–

  1. แž‘แžถแž‰แž™แž€แž˜แŸ‚แž€แž’แžถแž„แž–แžธแžšแž–แžธแž‡แžฝแžšแžขแžถแž‘แžทแž—แžถแž– แž แžพแž™แž’แŸ’แžœแžพแžฑแŸ’แž™แž–แžฝแž€แžœแžถแž‡แžถแž€แžผแž“แžแŸ’แž“แžถแŸ†แž„แžแŸ’แž˜แžธ (แžแŸ’แž“แžถแŸ†แž„แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž€แžพแžแžแŸ’แž˜แžธแžŠแŸ„แž™แž‚แŸ’แž˜แžถแž“แžขแž€แŸ’แžŸแžš)แŸ” แž”แŸ’แžšแŸแž€แž„แŸ‹แž“แŸƒแžแŸ’แž“แžถแŸ†แž„แžแŸ’แž˜แžธแž‚แžบแžŸแŸ’แž˜แžพแž“แžนแž„แž•แž›แž”แžผแž€แž“แŸƒแž”แŸ’แžšแŸแž€แž„แŸ‹แž“แŸƒแžŠแžพแž˜แžˆแžพแž”แž“แŸ’แžแž–แžผแž‡แž‘แžถแŸ†แž„แž–แžธแžšแŸ”
  2. แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ’แž“แžถแŸ†แž„แž“แŸแŸ‡ แž”แž„แŸ’แž€แžพแžแž˜แŸ‚แž€แž’แžถแž„แžŠแŸ‚แž›แž˜แžถแž“แžซแžŸแž‚แž›แŸ‹แž“แŸ…แžแŸ’แž“แžถแŸ†แž„แž“แŸแŸ‡แŸ” แž”แž‰แŸ’แž…แžผแž›แž˜แŸ‚แž€แž’แžถแž„แž“แŸแŸ‡แžแŸ’แžšแžกแž”แŸ‹แž‘แŸ…แž‡แžฝแžšแžขแžถแž‘แžทแž—แžถแž–แŸ” (แž…แžถแž”แŸ‹แžแžถแŸ†แž„แž–แžธแžŠแžพแž˜แžˆแžพแž˜แžถแž“แž”แŸ’แžšแŸแž€แž„แŸ‹แžแŸ’แž˜แžธ แžœแžถแž‘แŸ†แž“แž„แž‡แžถแž“แžนแž„แž…แžผแž›แž‘แŸ…แž€แž“แŸ’แž›แŸ‚แž„แžแŸ’แž˜แžธแž“แŸ…แž€แŸ’แž“แžปแž„แž‡แžฝแžš)
  3. แž”แž“แŸ’แžแž‡แŸ†แž แžถแž“แž‘แžธ 1 แž“แžทแž„แž‘แžธ 2 แžšแž แžผแžแžŠแž›แŸ‹แžŠแžพแž˜แžˆแžพแž˜แžฝแž™แž“แŸ…แžŸแž›แŸ‹แž€แŸ’แž“แžปแž„แž‡แžฝแžš - แžŠแžพแž˜แžˆแžพ Huffman

แž–แžทแž…แžถแžšแžŽแžถแž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แž“แŸแŸ‡แž“แŸ…แž›แžพแž”แž“แŸ’แž‘แžถแžแŸ‹ s1:

แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž˜แžฝแž™แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman

แž“แŸ…แž‘แžธแž“แŸแŸ‡แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถ "lf" (linefeed) แž”แž„แŸ’แž แžถแž‰แž–แžธแž”แž“แŸ’แž‘แžถแžแŸ‹แžแŸ’แž˜แžธ "sp" (space) แž‚แžบแž‡แžถแž›แŸ†แž แŸ”

แž˜แžถแž“โ€‹แžขแŸ’แžœแžธโ€‹แž”แž“แŸ’แž‘แžถแž”แŸ‹?

แž™แžพแž„แž‘แž‘แžฝแž›แž”แžถแž“แžŠแžพแž˜แžˆแžพ Huffman แŸ” แž™แž›แŸ‹แž–แŸ’แžšแž˜แŸ” แž แžพแž™แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž’แŸ’แžœแžพแž‡แžถแž˜แžฝแž™แžœแžถ? แž–แžฝแž€แž‚แŸแž“แžนแž„แž˜แžทแž“แž™แž€แžœแžถแžŠแŸ„แž™แžฅแžแž‚แžทแžแžแŸ’แž›แŸƒแž‘แŸแŸ” แž แžพแž™แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€ แžขแŸ’แž“แž€แžแŸ’แžšแžผแžœแžแžถแž˜แžŠแžถแž“แž•แŸ’แž›แžผแžœแžŠแŸ‚แž›แžขแžถแž…แž’แŸ’แžœแžพแž”แžถแž“แž‘แžถแŸ†แž„แžขแžŸแŸ‹แž–แžธแžซแžŸแž‘แŸ…แžŸแŸ’แž›แžนแž€แžšแž”แžŸแŸ‹แžŠแžพแž˜แžˆแžพแŸ” แž™แžพแž„แž™แž›แŸ‹แž–แŸ’แžšแž˜แžŠแžถแž€แŸ‹แžŸแŸ’แž›แžถแž€แž‚แŸ‚แž˜ 0 แž”แŸ’แžšแžŸแžทแž“แž”แžพแžœแžถแž“แžถแŸ†แž‘แŸ…แž€แžผแž“แžแžถแž„แž†แŸ’แžœแŸแž„ แž“แžทแž„ 1 แž”แŸ’แžšแžŸแžทแž“แž”แžพแžœแžถแž“แžถแŸ†แž‘แŸ…แžแžถแž„แžŸแŸ’แžแžถแŸ†แŸ” แž“แžทแž™แžถแž™แž™แŸ‰แžถแž„แžแžนแž„แžšแžนแž„แž“แŸ…แž€แŸ’แž“แžปแž„แžŸแž‰แŸ’แž‰แžถแžŽแž‘แžถแŸ†แž„แž“แŸแŸ‡ แž€แžผแžŠแžแžฝแžขแž€แŸ’แžŸแžšแž‚แžบแž‡แžถแž•แŸ’แž›แžผแžœแž–แžธแžซแžŸแž“แŸƒแžŠแžพแž˜แžˆแžพแž‘แŸ…แžŸแŸ’แž›แžนแž€แžŠแŸ‚แž›แž˜แžถแž“แžแžฝแžขแž€แŸ’แžŸแžšแžŠแžผแž…แž‚แŸ’แž“แžถแž“แŸแŸ‡แŸ”

แž€แžถแžšแž”แž„แŸ’แž แžถแž”แŸ‹แž‘แžทแž“แŸ’แž“แž“แŸแž™แž‡แžถแž˜แžฝแž™แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ Huffman

แžŠแžผแž…แŸ’แž“แŸแŸ‡แžแžถแžšแžถแž„แž›แŸแžแž€แžผแžŠแž”แžถแž“แž”แŸ’แžšแŸ‚แž€แŸ’แž›แžถแž™แŸ” แž…แŸ†แžŽแžถแŸ†แžแžถแž”แŸ’แžšแžŸแžทแž“แž”แžพแž™แžพแž„แž–แžทแž…แžถแžšแžŽแžถแžแžถแžšแžถแž„แž“แŸแŸ‡แž™แžพแž„แžขแžถแž…แžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“แžขแŸ†แž–แžธ "แž‘แž˜แŸ’แž„แž“แŸ‹" แž“แŸƒแžแžฝแžขแž€แŸ’แžŸแžšแž“แžธแž˜แžฝแž™แŸ— - แž“แŸแŸ‡แž‚แžบแž‡แžถแž”แŸ’แžšแžœแŸ‚แž„แž“แŸƒแž€แžผแžŠแžšแž”แžŸแŸ‹แžœแžถแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹แžŠแŸ‚แž›แž”แžถแž“แž”แž„แŸ’แž แžถแž”แŸ‹ แžฏแž€แžŸแžถแžšแž”แŸ’แžšแž—แž–แž“แžนแž„แž˜แžถแž“แž‘แž˜แŸ’แž„แž“แŸ‹แŸ– 2 * 3 + 2 * 4 + 3 * 3 + 6 * 2 + 1 * 4 + 1 * 5 + 2 * 4 + 4 * 2 + 1 * 5 = 65 แž”แŸŠแžธแž . แžŠแŸ†แž”แžผแž„แžœแžถแž˜แžถแž“แž‘แž˜แŸ’แž„แž“แŸ‹ 176 แž”แŸŠแžธแžแŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž™แžพแž„แž”แžถแž“แž€แžถแžแŸ‹แž”แž“แŸ’แžแž™แžœแžถ 176/65 = 2.7 แžŠแž„! แž”แŸ‰แžปแž“แŸ’แžแŸ‚แž“แŸแŸ‡แž‚แžบแž‡แžถ utopia แŸ” แžŸแž˜แžถแž˜แžถแžแŸ’แžšแž”แŸ‚แž”แž“แŸแŸ‡แž‘แŸ†แž“แž„แž‡แžถแž˜แžทแž“แžแŸ’แžšแžผแžœแž”แžถแž“แž‘แž‘แžฝแž›แž‘แŸแŸ” แž แŸแžแžปแžขแŸ’แžœแžธ? แž“แŸแŸ‡แž“แžนแž„แžแŸ’แžšแžผแžœแž”แžถแž“แž–แžทแž—แžถแž€แŸ’แžŸแžถแž”แž“แŸ’แžแžทแž…แž€แŸ’แžšแŸ„แž™แž˜แž€แŸ”

แž€แžถแžšแžŒแžทแž€แžผแžŠ

แž‡แžถแž€แžถแžšแž”แŸ’แžšแžŸแžพแžšแžŽแžถแžŸแŸ‹, แž”แŸ’แžšแž แŸ‚แž›แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แžŸแžถแž˜แž‰แŸ’แž‰แž”แŸ†แž•แžปแžแžŠแŸ‚แž›แž“แŸ…แžŸแž›แŸ‹แž‚แžบแž€แžถแžšแžŒแžทแž€แžผแžŠแŸ” แžแŸ’แž‰แžปแŸ†โ€‹แž‚แžทแžโ€‹แžแžถ แžขแŸ’แž“แž€โ€‹แž‡แžถโ€‹แž…แŸ’แžšแžพแž“โ€‹แž”แžถแž“โ€‹แž‘แžถแž™โ€‹แžแžถโ€‹แžœแžถโ€‹แž˜แžทแž“โ€‹แžขแžถแž…โ€‹แž‘แŸ…โ€‹แžšแžฝแž…โ€‹แž‘แŸโ€‹แž€แŸ’แž“แžปแž„โ€‹แž€แžถแžšโ€‹แž”แž„แŸ’แž€แžพแžโ€‹แžฏแž€แžŸแžถแžšโ€‹แž”แž„แŸ’แž แžถแž”แŸ‹โ€‹แžŠแŸ„แž™โ€‹แž˜แžทแž“โ€‹แž˜แžถแž“โ€‹แžแž˜แŸ’แžšแžปแž™โ€‹แž–แžธโ€‹แžšแž”แŸ€แž”โ€‹แžŠแŸ‚แž›โ€‹แžœแžถโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แžขแŸŠแžทแž“แž€แžผแžŠโ€‹แž“แŸ„แŸ‡โ€‹แž‘แŸ แž™แžพแž„โ€‹แž“แžนแž„โ€‹แž˜แžทแž“โ€‹แžขแžถแž…โ€‹แžŒแžทแž€แžผแžŠโ€‹แžœแžถโ€‹แž”แžถแž“โ€‹แž‘แŸ! แž”แžถแž‘ แž”แžถแž‘ แžœแžถแž–แžทแž”แžถแž€แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ’แž‰แžปแŸ†แž€แŸ’แž“แžปแž„แž€แžถแžšแž™แž›แŸ‹แžŠแžนแž„แžขแŸ†แž–แžธแžšแžฟแž„แž“แŸแŸ‡ แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแŸ’แž‰แžปแŸ†แžแŸ’แžšแžผแžœแžแŸ‚แž”แž„แŸ’แž€แžพแžแžฏแž€แžŸแžถแžšแžขแžแŸ’แžแž”แž‘ table.txt แž‡แžถแž˜แžฝแž™แž“แžนแž„แžแžถแžšแžถแž„แž”แž„แŸ’แž แžถแž”แŸ‹แŸ–

01110
 00
A010
E1111
I110
S10
T0110
U01111
Y1110

แž’แžถแžแžปแžแžถแžšแžถแž„แž€แŸ’แž“แžปแž„แž‘แž˜แŸ’แžšแž„แŸ‹ 'แžแžฝแžขแž€แŸ’แžŸแžš' "แž€แžผแžŠแžแžฝแžขแž€แŸ’แžŸแžš" แŸ” แž แŸแžแžปแžขแŸ’แžœแžธแž”แžถแž“แž‡แžถ 01110 แž‚แŸ’แž˜แžถแž“แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถ? แžแžถแž˜แž–แžทแžแž‘แŸ… แžœแžถแž‚แžบแž‡แžถแž˜แžฝแž™แž“แžนแž„แž“แžทแž˜แžทแžแŸ’แžแžŸแž‰แŸ’แž‰แžถแž˜แžฝแž™ แž‚แŸ’แžšแžถแž“แŸ‹แžแŸ‚แž‡แžถแžงแž”แž€แžšแžŽแŸ java แžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž”แŸ’แžšแžพแž“แŸ…แž–แŸแž›แž…แŸแž‰แžฏแž€แžŸแžถแžšแž˜แžฝแž™ แžแžฝแžขแž€แŸ’แžŸแžšแž”แž“แŸ’แž‘แžถแžแŸ‹แžแŸ’แž˜แžธ - 'n' - แžแŸ’แžšแžผแžœแž”แžถแž“แž”แŸ†แž”แŸ’แž›แŸ‚แž„แž‘แŸ…แž‡แžถแž”แž“แŸ’แž‘แžถแžแŸ‹แžแŸ’แž˜แžธ (แž˜แžทแž“แžแžถแžœแžถแžŸแŸ’แžแžถแž”แŸ‹แž‘แŸ…แž›แŸ’แž„แž„แŸ‹แž™แŸ‰แžถแž„แžŽแžถแž‘แŸ)แŸ” แžŠแžผแž…แŸ’แž“แŸแŸ‡ แž”แž“แŸ’แž‘แžถแžแŸ‹แž‘แž‘แŸแžแžถแž„แž›แžพแž‚แžบแž‡แžถแžแžฝแžขแž€แŸ’แžŸแžšแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž›แŸแžแž€แžผแžŠ 01110แŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž›แŸแžแž€แžผแžŠ 00 แžแžฝแžขแž€แŸ’แžŸแžšแž‚แžบแž‡แžถแž…แž“แŸ’แž›แŸ„แŸ‡แž“แŸ…แžŠแžพแž˜แž”แž“แŸ’แž‘แžถแžแŸ‹แŸ” แžแŸ’แž‰แžปแŸ†แžแŸ’แžšแžผแžœแžแŸ‚แž“แžทแž™แžถแž™แž—แŸ’แž›แžถแž˜แŸ—แžแžถ แžœแžทแž’แžธแžŸแžถแžŸแŸ’แžšแŸ’แžแž“แŸƒแž€แžถแžšแžšแž€แŸ’แžŸแžถแž‘แžปแž€แžแžถแžšแžถแž„แž“แŸแŸ‡แžขแžถแž…แžขแŸ‡แžขแžถแž„แžแžถแž˜แžทแž“แžŸแž˜แž แŸแžแžปแž•แž›แž”แŸ†แž•แžปแžแžŸแž˜แŸ’แžšแžถแž”แŸ‹แž˜แŸแž‚แžปแžŽแžแžถแž“แŸ‹แžšแž”แžŸแŸ‹แž™แžพแž„แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžœแžถแž„แžถแž™แžŸแŸ’แžšแžฝแž›แž™แž›แŸ‹ แž“แžทแž„แžขแž“แžปแžœแžแŸ’แžแŸ” แžแŸ’แž‰แžปแŸ†แž“แžนแž„แžšแžธแž€แžšแžถแž™แž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแŸ’แžแžถแž”แŸ‹แž€แžถแžšแžŽแŸ‚แž“แžถแŸ†แžšแž”แžŸแŸ‹แžขแŸ’แž“แž€แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แžแžทแž™แŸ„แž”แž›แŸ‹แžขแŸ†แž–แžธแž€แžถแžšแž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แŸ”

แž‡แžถแž˜แžฝแž™แž“แžนแž„แžแžถแžšแžถแž„แž“แŸแŸ‡แžœแžถแž„แžถแž™แžŸแŸ’แžšแžฝแž›แžŽแžถแžŸแŸ‹แž€แŸ’แž“แžปแž„แž€แžถแžšแžŒแžทแž€แžผแžŠแŸ” แž…แžผแžšแž™แžพแž„แž…แžถแŸ†แžแžถแžแžพแž…แŸ’แž”แžถแž”แŸ‹แžŽแžถแžŠแŸ‚แž›แž™แžพแž„แžแŸ’แžšแžผแžœแž”แžถแž“แžŽแŸ‚แž“แžถแŸ†แž“แŸ…แž–แŸแž›แž”แž„แŸ’แž€แžพแžแž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠแŸ–

แž‚แŸ’แž˜แžถแž“แž›แŸแžแž€แžผแžŠแžแŸ’แžšแžผแžœแžแŸ‚แž‡แžถแž”แžปแž–แŸ’แžœแž”แž‘แž“แŸƒแž˜แžฝแž™แž•แŸ’แžŸแŸแž„แž‘แŸ€แž

แž“แŸแŸ‡แž‚แžบแž‡แžถแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แžœแžถแžŠแžพแžšแžแžฝแž“แžถแž‘แžธแžŸแž˜แŸ’แžšแž”แžŸแž˜แŸ’แžšแžฝแž›แŸ” แž™แžพแž„แžขแžถแž“แž”แž“แŸ’แžแžทแž…แž˜แŸ’แžแž„แŸ—แžแžถแž˜แž›แŸ†แžŠแžถแž”แŸ‹แž›แŸ†แžŠแŸ„แž™ แž แžพแž™แžŠแžšแžถแž”แžŽแžถแž›แž‘แŸ’แž’แž•แž›แž›แž‘แŸ’แž’แž•แž› d แžŠแŸ‚แž›แž˜แžถแž“แž”แŸŠแžธแžแžขแžถแž“แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแž“แžนแž„แž€แžถแžšแžขแŸŠแžทแž“แž€แžผแžŠแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž‚แŸ’แž“แžถแž“แžนแž„แžแžฝแžขแž€แŸ’แžŸแžšแžแžฝแžขแž€แŸ’แžŸแžš แž™แžพแž„แžŠแžนแž„แž—แŸ’แž›แžถแž˜แžแžถแžแžฝแžขแž€แŸ’แžŸแžšแžแžฝแžขแž€แŸ’แžŸแžš (แž แžพแž™แž˜แžถแž“แžแŸ‚แžแžฝแžขแž€แŸ’แžŸแžšแž”แŸ‰แžปแžŽแŸ’แžŽแŸ„แŸ‡!) แžแŸ’แžšแžผแžœแž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแŸ” แž”แž“แŸ’แž‘แžถแž”แŸ‹แž™แžพแž„แžŸแžšแžŸแŸแžšแžแžฝแžขแž€แŸ’แžŸแžšแž‘แŸ…แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแžŒแžทแž€แžผแžŠ (แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžšแžŠแŸ‚แž›แž˜แžถแž“แžŸแžถแžšแžŠแŸ‚แž›แž”แžถแž“แžŒแžทแž€แžผแžŠ) แž€แŸ†แžŽแžแŸ‹แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžš d แžกแžพแž„แžœแžทแž‰แž แžพแž™แžขแžถแž“แžฏแž€แžŸแžถแžšแžŠแŸ‚แž›แž”แžถแž“แžขแŸŠแžทแž“แž€แžผแžŠแž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ€แžแŸ”

ะ ะตะฐะปะธะทะฐั†ะธั

แžœแžถแžŠแž›แŸ‹แž–แŸแž›แžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž”แž“แŸ’แž‘แžถแž”แž”แž“แŸ’แžแŸ„แž€แž›แŸแžแž€แžผแžŠแžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แžŠแŸ„แž™แž€แžถแžšแžŸแžšแžŸแŸแžšแž”แžŽแŸ’แžŽแžŸแžถแžšแŸ” แžแŸ„แŸ‡แž แŸ…แžœแžถแžแžถ CompressorแŸ”

แžŸแžถแžšโ€‹แžกแžพแž„แžœแžทแž‰แŸ” แžŠแŸ†แž”แžผแž„แž™แžพแž„แžŸแžšแžŸแŸแžš Node classแŸ–

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;//ะฒะพะทะฒั€ะฐั‰ะฐะตะผ ัƒะดะฐะปะตะฝะฝั‹ะน ัะปะตะผะตะฝั‚(ัะปะตะผะตะฝั‚ ั ะฝะฐะธะผะตะฝัŒัˆะตะน ั‡ะฐัั‚ะพั‚ะพะน)
    }
}

แžแŸ’แž“แžถแž€แŸ‹แžŠแŸ‚แž›แž”แž„แŸ’แž€แžพแžแž˜แŸ‚แž€แž’แžถแž„ HuffmanแŸ–

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 แžŠแŸ„แž™แžแŸ’แž›แžฝแž“แžฏแž„๐Ÿ™‚

แžŸแŸแž…แž€แŸ’แžแžธแžŸแž“แŸ’แž“แžทแžŠแŸ’แž‹แžถแž“

แžแŸ’แž‰แžปแŸ†แž‚แžทแžแžแžถแž“แŸ„แŸ‡แž‡แžถแžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แž‰แžปแŸ†แž…แž„แŸ‹แž“แžทแž™แžถแž™แŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžขแŸ’แž“แž€แž˜แžถแž“แžขแŸ’แžœแžธแžŠแŸ‚แž›แžแŸ’แžšแžผแžœแž“แžทแž™แžถแž™แžขแŸ†แž–แžธแž—แžถแž–แžขแžŸแž˜แžแŸ’แžแž—แžถแž–แžšแž”แžŸแŸ‹แžแŸ’แž‰แžปแŸ†แž€แŸ’แž“แžปแž„แž€แžถแžšแž’แŸ’แžœแžพแžฑแŸ’แž™แž”แŸ’แžšแžŸแžพแžšแžกแžพแž„แž“แŸ…แž€แŸ’แž“แžปแž„แž€แžผแžŠ แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™ แž‡แžถแž‘แžผแž‘แŸ…แž€แžถแžšแž”แž„แŸ’แž€แžพแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžŽแžถแž˜แžฝแž™ แž”แž“แŸ’แž‘แžถแž”แŸ‹แž˜แž€แž˜แžถแž“แžขแžถแžšแž˜แŸ’แž˜แžŽแŸแžŸแŸแžšแžธแž€แŸ’แž“แžปแž„แž€แžถแžšแžŸแžšแžŸแŸแžšแŸ” แž”แŸ’แžšแžŸแžทแž“แž”แžพแžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž”แžถแž“แž–แž“แŸ’แž™แž›แŸ‹แžขแŸ’แžœแžธแž‘แŸ แžŸแžผแž˜แžŸแžšแžŸแŸแžšแž•แž„แžŠแŸ‚แžšแŸ” แžแŸ’แž‰แžปแŸ†แž…แž„แŸ‹แžฎแž–แžธแžขแŸ’แž“แž€แž“แŸ…แž€แŸ’แž“แžปแž„แž˜แžแžทแž™แŸ„แž”แž›แŸ‹!

PS

แž”แžถแž‘/แž…แžถแžŸแŸŽ แžแŸ’แž‰แžปแŸ†แž“แŸ…แžแŸ‚แž“แŸ…แž‘แžธแž“แŸแŸ‡ แž–แŸ’แžšแŸ„แŸ‡แžแŸ’แž‰แžปแŸ†แž˜แžทแž“แž”แžถแž“แž—แŸ’แž›แŸแž…แžขแŸ†แž–แžธแž˜แŸแž‚แžปแžŽแž‘แŸแŸ” แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžแŸ’แžŸแŸ‚แžขแž€แŸ’แžŸแžš s1 แžแžถแžšแžถแž„แž”แŸ†แž›แŸ‚แž„แž€แžผแžŠแž˜แžถแž“แž‘แž˜แŸ’แž„แž“แŸ‹ 48 แž”แŸƒ - แž…แŸ’แžšแžพแž“แž‡แžถแž„แžฏแž€แžŸแžถแžšแžŠแžพแž˜ แž แžพแž™แž–แžฝแž€แž‚แŸแž˜แžทแž“แž”แžถแž“แž—แŸ’แž›แŸแž…แžขแŸ†แž–แžธแž›แŸแžแžŸแžผแž“แŸ’แž™แž”แž“แŸ’แžแŸ‚แž˜แž‘แŸ (แž…แŸ†แž“แžฝแž“แž›แŸแžแžŸแžผแž“แŸ’แž™แž”แž“แŸ’แžแŸ‚แž˜แž‚แžบ 7) => แžŸแž˜แžถแž˜แžถแžแŸ’แžšแž”แž„แŸ’แž แžถแž”แŸ‹แž“แžนแž„แžแžทแž…แž‡แžถแž„แž˜แžฝแž™: 176 /(65 + 48 * 8 + 7) = 0.38 แŸ” แž”แžพโ€‹แžขแŸ’แž“แž€โ€‹แž€แŸโ€‹แžŸแž˜แŸ’แž‚แžถแž›แŸ‹โ€‹แžƒแžพแž‰โ€‹แž…แŸ†แžŽแžปแž…โ€‹แž“แŸแŸ‡โ€‹แžŠแŸ‚แžš แž‚แŸ’แžšแžถแž“แŸ‹โ€‹แžแŸ‚โ€‹แž˜แžทแž“โ€‹แž“แŸ…โ€‹แž˜แžปแžโ€‹แžขแŸ’แž“แž€โ€‹แž€แŸโ€‹แžšแžฝแž…โ€‹แžŠแŸ‚แžšแŸ” แž”แžถแž‘ แž€แžถแžšแžขแž“แžปแžœแžแŸ’แžแž“แŸแŸ‡แž“แžนแž„แž‚แŸ’แž˜แžถแž“แž”แŸ’แžšแžŸแžทแž‘แŸ’แž’แž—แžถแž–แžแŸ’แž›แžถแŸ†แž„แžŸแž˜แŸ’แžšแžถแž”แŸ‹แžฏแž€แžŸแžถแžšแžแžผแž…แŸ—แŸ” แž”แŸ‰แžปแž“แŸ’แžแŸ‚แžแžพแž˜แžถแž“แžขแŸ’แžœแžธแž€แžพแžแžกแžพแž„แž…แŸ†แž–แŸ„แŸ‡แžฏแž€แžŸแžถแžšแž’แŸ†? แž‘แŸ†แž แŸ†แžฏแž€แžŸแžถแžšแž˜แžถแž“แž‘แŸ†แž แŸ†แž’แŸ†แž‡แžถแž„แž‘แŸ†แž แŸ†แžแžถแžšแžถแž„แžขแŸŠแžทแž“แž€แžผแžŠแŸ” แž“แŸแŸ‡แž‡แžถแž€แž“แŸ’แž›แŸ‚แž„แžŠแŸ‚แž›แž€แŸ’แž”แžฝแž“แžŠแŸ„แŸ‡แžŸแŸ’แžšแžถแž™แžŠแŸ†แžŽแžพแžšแž€แžถแžšแžŠแžผแž…แžŠแŸ‚แž›แžœแžถแž‚แžฝแžšแžแŸ‚! แžงแž‘แžถแž แžšแžŽแŸแžŸแž˜แŸ’แžšแžถแž”แŸ‹ แžขแž€แŸ’แžŸแžšแž€แžถแžแŸ‹แžšแž”แžŸแŸ‹ Faust แž”แžŽแŸ’แžŽแžŸแžถแžšแž•แŸ’แžแž›แŸ‹แžฑแŸ’แž™แž˜แŸแž‚แžปแžŽแž–แžทแžแž”แŸ’แžšแžถแž€แžŠ (แž˜แžทแž“แžŸแž˜แž แŸแžแžปแž•แž›) แžŸแŸ’แž˜แžพแž“แžนแž„ 1.46 - แžŸแŸ’แž‘แžพแžšแžแŸ‚แž˜แžฝแž™แžŠแž„แž€แž“แŸ’แž›แŸ‡! แž”แžถแž‘ แžฏแž€แžŸแžถแžšโ€‹แžแŸ’แžšแžผแžœโ€‹แž”แžถแž“โ€‹แžŸแž“แŸ’แž˜แžโ€‹แžแžถโ€‹แž‡แžถโ€‹แž—แžถแžŸแžถโ€‹แžขแž„แŸ‹แž‚แŸ’แž›แŸแžŸแŸ”

แž”แŸ’แžšแž—แž–: www.habr.com

แž”แž“แŸ’แžแŸ‚แž˜แž˜แžแžทแž™แŸ„แž”แž›แŸ‹