day28

package datastructure.tree;

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.stream.Collectors;

/**
 * ******************************************
 * Huffman tree, encoding, and decoding. For simplicity, only ASCII characters
 * are supported.
 *
 * @author Michelle Min MitchelleMin@163.com
 * @date 2021-06-15
 * ******************************************
 */
public class Huffman {

    /*
    An inner class for Huffman nodes.
     */
    class HuffmanNode {
        /*
        The char. Only valid for leaf nodes.
        */
        char character;

        /*
        Weight. It can also be double.
         */
        int weight;

        /*
        The left child.
         */
        HuffmanNode leftChild;

        /*
        The right child.
         */
        HuffmanNode rightChild;

        /*
        The parent. It helps constructing the Huffman code of each character.
         */
        HuffmanNode parent;

        /**
         * *******************************
         * The first constructor
         * *******************************
         */
        public HuffmanNode(char paraCharacter, int paraWeight, HuffmanNode paraLeftChild, HuffmanNode paraRightChild, HuffmanNode paraParent) {
            character = paraCharacter;
            weight = paraWeight;
            leftChild = paraLeftChild;
            rightChild = paraRightChild;
            parent = paraParent;
        }//Of HuffmanNode

        /**
         * *******************************
         * To string.
         * *******************************
         */
        public String toString() {
            String resultString = "(" + character + ", " + weight + ")";
            return resultString;
        }//of toString
    }//Of class HuffmanNode

    /*
    The number of characters. 256 for ASCII.
     */
    public static final int NUM_CHARS = 256;

    /*
    The input text. It is stored in a string for simplicity.
     */
    String inputText;

    /*
    The length of the alphabet, also the number of leaves.
     */
    int alphabetLength;

    /*
    The alphabet.
     */
    char[] alphabet;

    /*
    The count of chars. The length is 2 * alphabetLength - 1 to include
    non-leaf nodes.
     */
    int[] charCounts;

    /*
    The mapping of chars to the indices in the alphabet.
     */
    int[] charMapping;

    /*
    Codes for each char in the alphabet. It should have the same length as
    alphabet.
     */
    String[] huffmanCodes;

    /*
    All nodes. The last node is the root.
     */
    HuffmanNode[] nodes;

    /**
     ********************************
     * The first constructor.
     *
     * @param paraFilename
     * The text filename.
     ********************************
     */
    public Huffman(String paraFilename){
        charMapping = new int[NUM_CHARS];

        readText(paraFilename);
    }//Of the first constructor

    /**
     ********************************
     * Read text.
     *
     * @param paraFilename
     * The text filename.
     ********************************
     */
    public void readText(String paraFilename){
        try{
            inputText = Files.newBufferedReader(Paths.get(paraFilename), StandardCharsets.UTF_8)
                    .lines().collect(Collectors.joining("\n"));
        }catch (Exception ee){
            System.out.println(ee);
            System.exit(0);
        }//Of try

        System.out.println("The text is: \r\n" + inputText);
    }//Of readText

    /**
     ********************************
     * The entrance of the program.
     *
     * @param args
     * Not used now.
     ********************************
     */
    public static void main(String args[]){
        Huffman tempHuffman = new Huffman("D:/mitchelles/data/huffmantext-small.txt");
    }//Of main
}//Of class Huffman

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值