zoukankan      html  css  js  c++  java
  • 哈夫曼编码实践

    实践内容

    设有字符集: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+"
    	";
        }
         //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)

  • 相关阅读:
    linux IPtable防火墙 禁止和开放端口
    Forward链、Input链和Output链的区别
    linux下导入、导出mysql数据库命令
    linux 环境下tomcat中部署jfinal项目
    android 调用系统界面
    效果超赞的基于js的chat组件和图形动画组件
    《Tsinghua oc mooc》第5~7讲 物理内存管理
    《Tsinghua os mooc》第1~4讲 启动、中断、异常和系统调用
    《MIT 6.828 Homework 2: Shell》解题报告
    《xv6 Appendices: PC Hardware and Boot loader》学习笔记
  • 原文地址:https://www.cnblogs.com/lijinquan/p/11927155.html
Copyright © 2011-2022 走看看