เชนเชซเชฎเซ‡เชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ

เชชเชฐเชฟเชšเชฏ

เช† เชฒเซ‡เช–เชฎเชพเช‚, เชนเซเช‚ เชœเชพเชฃเซ€เชคเชพ เชนเชซเชฎเซ‡เชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ, เชคเซ‡เชฎเชœ เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจเชฎเชพเช‚ เชคเซ‡เชจเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ.

เชชเชฐเชฟเชฃเชพเชฎเซ‡, เช…เชฎเซ‡ เชเช• เชธเชฐเชณ เช†เชฐเซเช•เชพเช‡เชตเชฐ เชฒเช–เซ€เชถเซเช‚. เช† เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชฅเชˆ เชšเซ‚เช•เซเชฏเซเช‚ เช›เซ‡ เชนเซ‡เชฌเซเชฐเซ‡ เชชเชฐเชจเซ‹ เชฒเซ‡เช–, เชชเชฐเช‚เชคเซ เชตเซเชฏเชตเชนเชพเชฐเชฟเช• เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเชจเชพ. เชตเชฐเซเชคเชฎเชพเชจ เชชเซ‹เชธเซเชŸเชจเซ€ เชธเซˆเชฆเซเชงเชพเช‚เชคเชฟเช• เชธเชพเชฎเช—เซเชฐเซ€ เชถเชพเชณเชพเชจเชพ เช•เซ‹เชฎเซเชชเซเชฏเซเชŸเชฐ เชตเชฟเชœเซเชžเชพเชจเชจเชพ เชชเชพเช  เช…เชจเซ‡ เชฐเซ‹เชฌเชฐเซเชŸ เชฒเชพเชซเซ‹เชฐเซ‡เชŸเชจเชพ เชชเซเชธเซเชคเช• "เชกเซ‡เชŸเชพ เชธเซเชŸเซเชฐเช•เซเชšเชฐเซเชธ เชเชจเซเชก เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธ เช‡เชจ เชœเชพเชตเชพ"เชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡. เชคเซ‡เชฅเซ€, เชฌเชงเซเช‚ เช•เชŸ เชนเซ‡เช เชณ เช›เซ‡!

เชฅเซ‹เชกเซเช‚ เชชเซเชฐเชคเชฟเชฌเชฟเช‚เชฌ

เชธเชพเชฎเชพเชจเซเชฏ เชŸเซ‡เช•เซเชธเซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚, เชเช• เช…เช•เซเชทเชฐ 8 เชฌเชฟเชŸเซเชธ (ASCII เชเชจเซเช•เซ‹เชกเชฟเช‚เช—) เช…เชฅเชตเชพ 16 (เชฏเซเชจเชฟเช•เซ‹เชก เชเชจเซเช•เซ‹เชกเชฟเช‚เช—) เชธเชพเชฅเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช†เช—เชณ, เช…เชฎเซ‡ 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

เชฎเซ‡เช‚ เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐเชจเชพ เช•เซ‹เชกเชจเซ‡ เชธเซเชชเซ‡เชธ เชธเชพเชฅเซ‡ เช…เชฒเช— เช•เชฐเซเชฏเชพ เช›เซ‡. เชธเช‚เช•เซเชšเชฟเชค เชซเชพเช‡เชฒเชฎเชพเช‚ เช† เช–เชฐเซ‡เช–เชฐ เชฌเชจเชถเซ‡ เชจเชนเซ€เช‚!
เชชเซเชฐเชถเซเชจ เชŠเชญเซ‹ เชฅเชพเชฏ เช›เซ‡: เช† เชฐเซเช•เซ€ เช•เซ‹เชก เชธเชพเชฅเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช†เชตเซเชฏเซ‹ เช•เซ‹เชก เชŸเซ‡เชฌเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฌเชจเชพเชตเชตเซเช‚? เช†เชจเซ€ เชจเซ€เชšเซ‡ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชนเชซเชฎเซ‡เชจ เชตเซƒเช•เซเชทเชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ

เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชฆเซเชตเชฟเชธเช‚เช—เซ€ เชถเซ‹เชง เชตเซƒเช•เซเชทเซ‹ เชฌเชšเชพเชตเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชšเชฟเช‚เชคเชพ เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚, เชคเชฎเชพเชฐเซ‡ เช…เชนเซ€เช‚ เชชเชฆเซเชงเชคเชฟเช“ เชถเซ‹เชงเชตเชพ, เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เช•เชพเชขเซ€ เชจเชพเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชฐเชนเซ‡เชถเซ‡ เชจเชนเซ€เช‚. เช…เชนเซ€เช‚ เชœเชพเชตเชพเชฎเชพเช‚ เชตเซƒเช•เซเชทเชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เช›เซ‡:

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. เชธเช‚เชฆเซ‡เชถเชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เช…เช•เซเชทเชฐ เชฎเชพเชŸเซ‡ เชจเซ‹เชก เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‹ (เชฒเชพเช‡เชจ s1). เช…เชฎเชพเชฐเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเซเชฏเชพเช‚ 9 เชจเซ‹เชกเซเชธ (เชจเซ‹เชก เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ) เชนเชถเซ‡. เชฆเชฐเซ‡เช• เชจเซ‹เชกเชฎเชพเช‚ เชฌเซ‡ เชกเซ‡เชŸเชพ เชซเซ€เชฒเซเชก เชนเซ‹เชฏ เช›เซ‡: เชชเซเชฐเชคเซ€เช• เช…เชจเซ‡ เช†เชตเชฐเซเชคเชจ
  2. เชฆเชฐเซ‡เช• เชจเซ‹เชก เชจเซ‹เชก เชฎเชพเชŸเซ‡ เชŸเซเชฐเซ€ เช“เชฌเซเชœเซ‡เช•เซเชŸ (เชฌเชพเชˆเชจเชฐเซ€ เชŸเซเชฐเซ€) เชฌเชจเชพเชตเซ‹. เชจเซ‹เชก เชตเซƒเช•เซเชทเชจเซเช‚ เชฎเซ‚เชณ เชฌเชจเซ€ เชœเชพเชฏ เช›เซ‡.
  3. เช† เชตเซƒเช•เซเชทเซ‹เชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏเชคเชพ เช•เชคเชพเชฐเชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเซ‹. เช†เชตเชฐเซเชคเชจ เชœเซ‡เชŸเชฒเซ€ เช“เช›เซ€ เช›เซ‡, เชคเซ‡เชŸเชฒเซ€ เช…เช—เซเชฐเชคเชพ เชตเชงเชพเชฐเซ‡ เช›เซ‡. เช†เชฎ, เชฌเชนเชพเชฐ เช•เชพเชขเชคเซ€ เชตเช–เชคเซ‡, เชธเซŒเชฅเซ€ เช“เช›เซ€ เช†เชตเชฐเซเชคเชจ เชธเชพเชฅเซ‡เชจเซเช‚ เชตเซƒเช•เซเชท เชนเช‚เชฎเซ‡เชถเชพ เชชเชธเช‚เชฆ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช†เช—เชณ, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชšเช•เซเชฐเซ€เชฏ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

  1. เชชเซเชฐเชพเชงเชพเชจเซเชฏเชคเชพ เช•เชคเชพเชฐเชฎเชพเช‚เชฅเซ€ เชฌเซ‡ เชตเซƒเช•เซเชทเซ‹ เชชเซเชจเชƒเชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‹ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชจเชตเชพ เชจเซ‹เชก (เช…เช•เซเชทเชฐ เชตเชฟเชจเชพ เชจเชตเชพ เชฌเชจเชพเชตเซ‡เชฒ เชจเซ‹เชก) เชจเชพ เชฌเชพเชณเช•เซ‹ เชฌเชจเชพเชตเซ‹. เชจเชตเชพ เชจเซ‹เชกเชจเซ€ เช†เชตเชฐเซเชคเชจ เชฌเซ‡ เชตเช‚เชถเชœ เชตเซƒเช•เซเชทเซ‹เชจเซ€ เชซเซเชฐเซ€เช•เซเชตเชจเซเชธเซ€เชเชจเชพ เชธเชฐเชตเชพเชณเชพ เชœเซ‡เชŸเชฒเซ€ เช›เซ‡.
  2. เช† เชจเซ‹เชก เชฎเชพเชŸเซ‡, เช† เชจเซ‹เชก เชชเชฐ เชฎเซ‚เชณเชตเชพเชณเซเช‚ เชตเซƒเช•เซเชท เชฌเชจเชพเชตเซ‹. เช† เชตเซƒเช•เซเชทเชจเซ‡ เช…เช—เซเชฐเชคเชพ เช•เชคเชพเชฐเชฎเชพเช‚ เชชเชพเช›เซเช‚ เชฆเชพเช–เชฒ เช•เชฐเซ‹. (เชตเซƒเช•เซเชทเชจเซ€ เชจเชตเซ€ เช†เชตเชฐเซเชคเชจ เชนเซ‹เชตเชพเชฅเซ€, เชคเซ‡ เชฎเซ‹เชŸเชพเชญเชพเช—เซ‡ เช•เชคเชพเชฐเชฎเชพเช‚ เชจเชตเซ€ เชœเช—เซเชฏเชพเช เชชเซเชฐเชตเซ‡เชถ เช•เชฐเชถเซ‡)
  3. เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เชเช• เชตเซƒเช•เซเชท เช•เชคเชพเชฐเชฎเชพเช‚ เชฌเชพเช•เซ€ เชจ เชฐเชนเซ‡ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€ เชชเช—เชฒเชพเช‚ 1 เช…เชจเซ‡ 2 เชšเชพเชฒเซ เชฐเชพเช–เซ‹ - เชนเชซเชฎเซ‡เชจ เชตเซƒเช•เซเชท

เชฒเชพเช‡เชจ s1 เชชเชฐ เช† เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเชจเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซ‹:

เชนเชซเชฎเซ‡เชจ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพ เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ

เช…เชนเซ€เช‚ เชชเซเชฐเชคเซ€เช• "lf" (เชฒเชพเช‡เชจเชซเซ€เชก) เชจเชตเซ€ เชฒเซ€เชŸเซ€ เชฆเชฐเซเชถเชพเชตเซ‡ เช›เซ‡, "sp" (เชธเซเชชเซ‡เชธ) เช เชธเซเชชเซ‡เชธ เช›เซ‡.

เชชเช›เซ€ เชถเซเช‚ เช›เซ‡?

เช…เชฎเชจเซ‡ เชนเชซเชฎเซ‡เชจ เชตเซƒเช•เซเชท เชฎเชณเซเชฏเซเช‚. เชฌเชฐเชพเชฌเชฐ. เช…เชจเซ‡ เชคเซ‡เชจเซ€ เชธเชพเชฅเซ‡ เชถเซเช‚ เช•เชฐเชตเซเช‚? เชคเซ‡เช“ เชคเซ‡เชจเซ‡ เชฎเชซเชคเชฎเชพเช‚ เชฒเซ‡เชถเซ‡ เชจเชนเซ€เช‚. เช…เชจเซ‡ เชชเช›เซ€, เชคเชฎเชพเชฐเซ‡ เชฎเซ‚เชณเชฅเซ€ เชเชพเชกเชจเชพ เชชเชพเช‚เชฆเชกเชพ เชธเซเชงเซ€เชจเชพ เชคเชฎเชพเชฎ เชธเช‚เชญเชตเชฟเชค เชฐเชธเซเชคเชพเช“ เชถเซ‹เชงเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เช…เชฎเซ‡ เชงเชพเชฐเชจเซ‡ 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 เชชเซเชฐเชคเซ€เช• เชตเช—เชฐเชจเซเช‚ เช•เซ‡เชฎ เช›เซ‡? เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เชคเซ‡ เชเช• เชชเซเชฐเชคเซ€เช• เชธเชพเชฅเซ‡ เช›เซ‡, เชฎเชพเชคเซเชฐ เชœเชพเชตเชพ เชŸเซ‚เชฒเซเชธ เช•เซ‡ เชœเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชนเซเช‚ เชซเชพเช‡เชฒเชฎเชพเช‚ เช†เช‰เชŸเชชเซเชŸ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เช•เชฐเซเช‚ เช›เซเช‚, เชจเซเชฏเซ‚เชฒเชพเช‡เชจ เช…เช•เซเชทเชฐ - 'n' - เชจเชตเซ€ เชฒเชพเช‡เชจเชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡ (เชญเชฒเซ‡ เชคเซ‡ เช—เชฎเซ‡ เชคเซ‡เชŸเชฒเซเช‚ เชฎเซ‚เชฐเซเช– เชฒเชพเช—เซ‡). เชคเซ‡เชฅเซ€, เช‰เชชเชฐเชจเซ€ เช–เชพเชฒเซ€ เชฒเซ€เชŸเซ€ เช เช•เซ‹เชก 01110 เชฎเชพเชŸเซ‡เชจเซเช‚ เช…เช•เซเชทเชฐ เช›เซ‡. เช•เซ‹เชก 00 เชฎเชพเชŸเซ‡, เช…เช•เซเชทเชฐ เช เชฒเซ€เชŸเซ€เชจเซ€ เชถเชฐเซ‚เช†เชคเชฎเชพเช‚ เชเช• เชœเช—เซเชฏเชพ เช›เซ‡. เชฎเชพเชฐเซ‡ เชคเชฐเชค เชœ เช•เชนเซ‡เชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ เชŸเซ‡เชฌเชฒ เชธเซเชŸเซ‹เชฐ เช•เชฐเชตเชพเชจเซ€ เช† เชชเชฆเซเชงเชคเชฟ เช†เชชเชฃเชพ เช–เชพเชจ เช—เซเชฃเชพเช‚เช• เชฎเชพเชŸเซ‡ เชธเซŒเชฅเซ€ เช…เชคเชพเชฐเซเช•เชฟเช• เชนเซ‹เชตเชพเชจเซ‹ เชฆเชพเชตเซ‹ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชคเซ‡ เชธเชฎเชœเชตเซเช‚ เช…เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเซเช‚ เชธเชฐเชณ เช›เซ‡. เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจ เชตเชฟเชถเซ‡เชจเซ€ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชคเชฎเชพเชฐเซ€ เชญเชฒเชพเชฎเชฃเซ‹ เชธเชพเช‚เชญเชณเซ€เชจเซ‡ เชฎเชจเซ‡ เช†เชจเช‚เชฆ เชฅเชถเซ‡.

เช† เช•เซ‹เชทเซเชŸเช• เชธเชพเชฅเซ‡, เชกเซ€เช•เซ‹เชก เช•เชฐเชตเซเช‚ เช–เซ‚เชฌ เชœ เชธเชฐเชณ เช›เซ‡. เชšเชพเชฒเซ‹ เชฏเชพเชฆ เช•เชฐเซ€เช เช•เซ‡ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เชฌเชจเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เช…เชฎเชจเซ‡ เช•เชฏเชพ เชจเชฟเชฏเชฎ เชฆเซเชตเชพเชฐเชพ เชฎเชพเชฐเซเช—เชฆเชฐเซเชถเชจ เช†เชชเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚:

เช•เซ‹เชˆ เช•เซ‹เชก เชฌเซ€เชœเชพเชจเซ‹ เช‰เชชเชธเชฐเซเช— เชจ เชนเซ‹เชตเซ‹ เชœเซ‹เชˆเช

เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เชคเซ‡ เชธเซเชตเชฟเชงเชพเชœเชจเช• เชญเซ‚เชฎเชฟเช•เชพ เชญเชœเชตเซ‡ เช›เซ‡. เช…เชฎเซ‡ เช•เซเชฐเชฎเชถเชƒ เชฅเซ‹เชกเซเช‚-เชฅเซ‹เชกเซเช‚ เชตเชพเช‚เชšเซ€เช เช›เซ€เช, เช…เชจเซ‡ เชœเชฒเชฆเซ€ เชชเชฐเชฟเชฃเชพเชฎเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช— เชกเซ€, เชœเซ‡เชฎเชพเช‚ เชฐเซ€เชก เชฌเชฟเชŸเซเชธเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡, เช•เซ‡เชฐเซ‡เช•เซเชŸเชฐ เช•เซ‡เชฐเซ‡เช•เซเชŸเชฐเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เชธเชพเชฅเซ‡ เชฎเซ‡เชณ เช–เชพเชฏ เช›เซ‡, เช…เชฎเซ‡ เชคเชฐเชค เชœ เชœเชพเชฃเซ€เช เช›เซ€เช เช•เซ‡ เช•เซ‡เชฐเซ‡เช•เซเชŸเชฐ เช•เซ‡เชฐเซ‡เช•เซเชŸเชฐ (เช…เชจเซ‡ เชฎเชพเชคเซเชฐ เชคเซ‡ เชœ!) เชเชจเซเช•เซ‹เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเชคเซเช‚. เช†เช—เชณ, เช…เชฎเซ‡ เชกเซ€เช•เซ‹เชก เชธเซเชŸเซเชฐเชฟเช‚เช— (เชกเซ€เช•เซ‹เชก เช•เชฐเซ‡เชฒ เชธเช‚เชฆเซ‡เชถ เชงเชฐเชพเชตเชคเซ€ เชธเซเชŸเซเชฐเชฟเช‚เช—) เชชเชฐ เช…เช•เซเชทเชฐ เชฒเช–เซ€เช เช›เซ€เช, d เชธเซเชŸเซเชฐเชฟเช‚เช—เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ เชเชจเซเช•เซ‹เชก เช•เชฐเซ‡เชฒเซ€ เชซเชพเช‡เชฒเชจเซ‡ เช†เช—เชณ เชตเชพเช‚เชšเซ€เช เช›เซ€เช.

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

เช†เชฐเซเช•เชพเช‡เชตเชฐ เชฒเช–เซ€เชจเซ‡ เชฎเชพเชฐเชพ เช•เซ‹เชกเชจเซ‡ เช…เชชเชฎเชพเชจเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชธเชฎเชฏ เช†เชตเซ€ เช—เชฏเซ‹ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เช•เซ‹เชฎเซเชชเซเชฐเซ‡เชธเชฐ เช•เชนเซ€เช.

เชชเซเชฐเชพเชฐเช‚เชญ. เชธเซŒ เชชเซเชฐเชฅเชฎ, เช†เชชเชฃเซ‡ เชจเซ‹เชก เชตเชฐเซเช— เชฒเช–เซ€เช เช›เซ€เช:

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 เชธเซ‚เชšเชจเชพเช“ เชธเชพเชฅเซ‡ เชซเชพเช‡เชฒ เชฒเช–เชตเซ€ เชชเชกเชถเซ‡ ๐Ÿ™‚

เชจเชฟเชทเซเช•เชฐเซเชท

เชฎเชจเซ‡ เชฒเชพเช—เซ‡ เช›เซ‡ เช•เซ‡ เชนเซเช‚ เชเชŸเชฒเซเช‚ เชœ เช•เชนเซ‡เชตเชพ เชฎเชพเช‚เช—เชคเซ‹ เชนเชคเซ‹. เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เช•เซ‹เชก, เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ, เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡, เช•เซ‹เชˆเชชเชฃ เช‘เชชเซเชŸเชฟเชฎเชพเช‡เชเซ‡เชถเชจเชฎเชพเช‚ เชธเซเชงเชพเชฐเชพเช“เชจเซ€ เชฎเชพเชฐเซ€ เช…เชธเชฎเชฐเซเชฅเชคเชพ เชตเชฟเชถเซ‡ เช•เช‚เชˆเช• เช•เชนเซ‡เชตเชพเชจเซเช‚ เชนเซ‹เชฏ, เชคเซ‹ เชชเช›เซ€ เชฒเช–เชตเชพ เชฎเชพเชŸเซ‡ เชจเชฟเชƒเชธเช‚เช•เซ‹เชš. เชœเซ‹ เชฎเซ‡เช‚ เช•เช‚เชˆเช• เชธเชฎเชœเชพเชตเซเชฏเซเช‚ เชจเชฅเซ€, เชคเซ‹ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชชเชฃ เชฒเช–เซ‹. เชฎเชจเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡เชฅเซ€ เชธเชพเช‚เชญเชณเชตเซเช‚ เช—เชฎเชถเซ‡!

PS

เชนเชพ, เชนเชพ, เชนเซเช‚ เชนเชœเซ€ เชชเชฃ เช…เชนเซ€เช‚ เช›เซเช‚, เช•เชพเชฐเชฃ เช•เซ‡ เชนเซเช‚ เช—เซเชฃเชพเช‚เช• เชตเชฟเชถเซ‡ เชญเซ‚เชฒเซ€ เช—เชฏเซ‹ เชจเชฅเซ€. เชธเซเชŸเซเชฐเชฟเช‚เช— s1 เชฎเชพเชŸเซ‡, เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช•เซ‹เชทเซเชŸเช•เชจเซเช‚ เชตเชœเชจ 48 เชฌเชพเช‡เชŸเซเชธ เช›เซ‡ - เชฎเซ‚เชณ เชซเชพเช‡เชฒ เช•เชฐเชคเชพเช‚ เช˜เชฃเซเช‚ เชตเชงเชพเชฐเซ‡, เช…เชจเซ‡ เชคเซ‡เช“ เชตเชงเชพเชฐเชพเชจเชพ เชถเซ‚เชจเซเชฏ เชตเชฟเชถเซ‡ เชญเซ‚เชฒเซเชฏเชพ เชจเชฅเซ€ (เช‰เชฎเซ‡เชฐเซ‡เชฒเชพ เชถเซ‚เชจเซเชฏเชจเซ€ เชธเช‚เช–เซเชฏเชพ 7 เช›เซ‡) => เช•เชฎเซเชชเซเชฐเซ‡เชถเชจ เชฐเซ‡เชถเชฟเชฏเซ‹ เชเช• เช•เชฐเชคเชพ เช“เช›เซ‹ เชนเชถเซ‡: 176 /(65 + 48*8 + 7) = 0.38. เชœเซ‹ เชคเชฎเซ‡ เชชเชฃ เช† เชจเซ‹เช‚เชงเซเชฏเซเช‚ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เชซเช•เซเชค เชšเชนเซ‡เชฐเชพ เชชเชฐ เชœ เชจเชนเซ€เช‚, เชคเชฎเชพเชฐเซเช‚ เช•เชพเชฎ เชฅเชˆ เช—เชฏเซเช‚. เชนเชพ, เช† เช…เชฎเชฒเซ€เช•เชฐเชฃ เชจเชพเชจเซ€ เชซเชพเช‡เชฒเซ‹ เชฎเชพเชŸเซ‡ เช…เชคเซเชฏเช‚เชค เชฌเชฟเชจเช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชนเชถเซ‡. เชชเชฐเช‚เชคเซ เชฎเซ‹เชŸเซ€ เชซเชพเช‡เชฒเซ‹เชจเซเช‚ เชถเซเช‚ เชฅเชพเชฏ เช›เซ‡? เชซเชพเช‡เชฒเชจเซเช‚ เช•เชฆ เชเชจเซเช•เซ‹เชกเชฟเช‚เช— เช•เซ‹เชทเซเชŸเช•เชจเชพ เช•เชฆ เช•เชฐเชคเชพเช‚ เช˜เชฃเซเช‚ เชฎเซ‹เชŸเซเช‚ เช›เซ‡. เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎ เชœเซ‹เชˆเช เชคเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡! เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฎเชพเชŸเซ‡ เชซเซ‹เชธเซเชŸเชจเซเช‚ เชเช•เชชเชพเชคเซเชฐเซ€ เชจเชพเชŸเช• เช†เชฐเซเช•เชพเช‡เชตเชฐ 1.46 เชจเซ€ เชฌเชฐเชพเชฌเชฐ เชตเชพเชธเซเชคเชตเชฟเช• (เช†เชฆเชฐเซเชถ เชจเชนเซ€เช‚) เช—เซเชฃเชพเช‚เช• เช†เชชเซ‡ เช›เซ‡ - เชฒเช—เชญเช— เชฆเซ‹เชข เช—เชฃเซ‹! เช…เชจเซ‡ เชนเชพ, เชซเชพเชˆเชฒ เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ เชนเซ‹เชตเซ€ เชœเซ‹เชˆเชคเซ€ เชนเชคเซ€.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹