实践内容
设有字符集:S={a,b,c,d,e,f,g,h,i,j,k,l,m,n.o.p.q,r,s,t,u,v,w,x,y,z}。
给定一个包含26个英文字母的文件,统计每个字符出现的概率,根据计算的概率构造一颗哈夫曼树。
并完成对英文文件的编码和解码。
要求:
- (1)准备一个包含26个英文字母的英文文件(可以不包含标点符号等),统计各个字符的概率
- (2)构造哈夫曼树
- (3)对英文文件进行编码,输出一个编码后的文件
- (4)对编码文件进行解码,输出一个解码后的文件
- (5)撰写博客记录实验的设计和实现过程,并将源代码传到码云
- (6)把实验结果截图上传到云班课
实践过程
- 读取文件
- 构造哈夫曼树 哈夫曼树被称为最优树,有着二叉树的所有性质,但是要带上权重和记住左边的编码为“0”,右边的编码为“1”,所以重写了哈弗曼树的节点类
private T data;//数据
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
protected double weight;//权重
protected Node leftChild;
protected Node rightChild;
public String codeNumber;
public Node(T data , double weight)
{
this.data = data;
this.weight = weight;
this.codeNumber = "";
}
public String getCodeNumber() {
return codeNumber;
}
public void setCodeNumber(String codeNumber) {
this.codeNumber = codeNumber;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public String toString()
{
return "Node[data=" + data
+ ", weight=" + weight + ",codeNumber = "+codeNumber+"]";
}
}
- 基本思路:1)现在给定的n个有权值的元素,要构成一棵哈弗曼树,首先将这些元素按照权值,从小到大排序
2)然后在其中选择两个权值最小元素构成一棵二叉树的左右孩子,计算两个元素的权值之和,放入该二叉树的根节点中,
3)再从原对列中删除被选中的那两个元素,并且把构成的新的元素加到对列中,重新排序
4)重复2 ,3 操作,直到构成一棵完整的二叉树,就是哈夫曼树。
如图:
public Node(char data, double weight){
this.data = data;
this.weight = weight;
this.codenumber ="";
}
//dky20182335
public char getData() {
return data;
}
public void setData(char data) {
this.data = data;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
public String getCodenumber(){
return codenumber;
}
public void setCodenumber(String number){
codenumber = number;
}
@Override
public String toString(){
return "data:"+this.data+" weight:"+this.weight+" codenumber:"+this.codenumber+"\n\t";
}
//20182335
@Override
public int compareTo(Node other) {
if(other.getWeight() > this.getWeight()){
return 1;
}
if(other.getWeight() < this.getWeight()){
return -1;
}
else
return 0;
}
}