哈夫曼编码实践

实践内容

设有字符集: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<T> leftChild;

        protected Node<T> 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;
    }
}

测试结果

代码链接(https://gitee.com/li_jinquan/ljq/tree/master/Huffman)

posted @ 2019-11-25 13:25  李金泉  阅读(77)  评论(0编辑  收藏  举报