day28

Day28 —— Huffman编码

1. Background

今天是学习java的第28天了,今天学习的Huffman编码。也是我认为的数据结构中的大难点之一。

2. Description

霍夫曼(Huffman)编码是一种编码方式,主要用于数据文件的压缩。它的主要思想是放弃文本文件的普通保存方式:不再使用7位或8位二进制数表示每一个字符,而是用较少的比特表示出现频率高的字符,用较多的比特表示出现频率低的字符

今天的内容尚未深入的了解赫夫曼编码,只是先定义了其节点和文件读取。

3. Code

package datastructure;

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

/**
 * Heffman tree, encoding, and decoding.
 * 
 * @author Leo liu.
 */
public class Huffman {
    /**
     * Inner Huffman Node.
     */
    class HuffmanNode {
        // The char.
        char Character;

        // Weight.
        int Weight;

        // The left child.
        HuffmanNode LeftChild;

        // The right child.
        HuffmanNode RightChild;

        // The parent.
        HuffmanNode Parent;

        /**
         * 
         * The first constructure.
         * 
         * Override HeffmanNode.
         * 
         */
        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 HuffmanNode

    /**
	 * 字符的数量,256个ASCII字符。
	 */
	public static final int NUM_CHARS = 256;

	/**
	 * 输入的文本。
	 */
	String inputText;

	/**
	 * 字母表的长度。
	 */
	int alphabetLength;

	/**
	 * 字母表。
	 */
	char[] alphabet;

	// 字符数。长度包括非叶子节点,长度为2*alphabetLength.
	int[] charCounts;

	// 字符到字母表中的映射。
	int[] charMapping;

	// 字母表中每个字符的代码。
	String[] huffmanCodes;

	/**
	 * All nodes.
	 */
	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
    
    public static void main(String[] args) {
        Huffman tempHuffman = new Huffman("D:/java/vstest/src/datastructure/Huffman.txt");
    }
}

运行结果:

在这里插入图片描述

4. Summarize

今天用到了下面四个库,都是和文件存取有关的。

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

其中StandardCharset是标准字符集的常量定义。 这些字符集保证在 Java 平台的每个实现上都可用。

FilesPaths比较好理解,是关于文件和路径的。

stream.Collectors而这个则是在java stream中,我们通常需要将处理后的stream转换成集合类,这个时候就需要用到stream.collect方法。collect方法需要传入一个Collector类型,要实现Collector还是很麻烦的,需要实现好几个接口。

其中具体的方法介绍我直接贴一个链接吧,我觉得上面讲的已经很全面了。https://www.jianshu.com/p/3cb5ca04e3c8

最后,在传入文件路径的时候,我本想试试相对路径的,但是行不通,此处只支持绝对路径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值