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 平台的每个实现上都可用。
Files
和Paths
比较好理解,是关于文件和路径的。
stream.Collectors
而这个则是在java stream中,我们通常需要将处理后的stream转换成集合类,这个时候就需要用到stream.collect方法。collect方法需要传入一个Collector类型,要实现Collector还是很麻烦的,需要实现好几个接口。
其中具体的方法介绍我直接贴一个链接吧,我觉得上面讲的已经很全面了。https://www.jianshu.com/p/3cb5ca04e3c8
最后,在传入文件路径的时候,我本想试试相对路径的,但是行不通,此处只支持绝对路径。