1、 哈夫曼编码问题

我们希望压缩一个10万个字符的数据文件,下图给出文件中所出现的字符和他们的出现频率。

字符 频率(千次)
a 45
b 13
c 12
d 16
e 9
f 5

考虑一种二进制编码,每个字符用一个唯一的二进制串表示,给出压缩率最好的编码方式,也即字符的最优二进制表示。

java代码实现:

结构:

main函数:

package com;import com.TreeCode.Code;
import com.TreeCode.HuffNode;
import com.TreeCode.HuffmanTree;import java.util.Scanner;public class Main {public static void main(String[] args) {// write your code hereScanner input = new Scanner(System.in);int n,m;System.out.print("请输入字符个数:");n = input.nextInt();m=2*n-1;HuffmanTree huffmanTree=new HuffmanTree();HuffNode[] huffmanTreeNodes = new HuffNode[m];Code[] huffmanCode = new Code[n];//初始化huffmanTree,huffmanCodehuffmanTree.initHuffmanTree(huffmanTreeNodes,m);huffmanTree.initHuffmanCode(huffmanCode,n);//获取huffmanCode的符号System.out.print("请输入哈夫曼编码的字符:");huffmanTree.getHuffmanCode(huffmanCode,n);//获取huffmanTree的频数System.out.print("请输入哈夫曼编码字符对应的频数:");huffmanTree.getHuffmanWeight(huffmanTreeNodes,n);//创建huffmanTreehuffmanTree.createHaffmanTree(huffmanTreeNodes,n);//创建huffmanCodehuffmanTree.createHaffmanCode(huffmanTreeNodes,huffmanCode,n);//输出huffmanCode编码huffmanTree.ouputHaffmanCode(huffmanCode,n);}
}

哈夫曼编码类:

package com.TreeCode;public class Code
{String character;String code;Code(String character,String code){this.character=character;this.code=code;}Code(String code){this.code= code;}public String getCharacter() {return character;}public void setCharacter(String character) {this.character = character;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

哈夫曼树节点类:

package com.TreeCode;public class HuffNode
{int weight; //权值int parent ;//他的双亲int flag ;//标志,是否为叶子节点int leftChild; //他的左孩子int rightChild;//他的右孩子public HuffNode(int weight,int parent,int leftChild,int rightChild){this.weight=weight;this.parent=parent;this.leftChild=leftChild;this.rightChild=rightChild;}public int getWeight() {return weight;}public void setWeight(int weight) {this.weight = weight;}public int getParent() {return parent;}public void setParent(int parent) {this.parent = parent;}public int getFlag() {return flag;}public void setFlag(int flag) {this.flag = flag;}public int getLeftChild() {return leftChild;}public void setLeftChild(int leftChild) {this.leftChild = leftChild;}public int getRightChild() {return rightChild;}public void setRightChild(int rightChild) {this.rightChild = rightChild;}
}

哈夫曼树class:

package com.TreeCode;import java.util.Scanner;public class HuffmanTree
{//初始化一个huffuman树public static void initHuffmanTree(HuffNode[] huffmanTree,int m){for(int i=0;i<m;i++){huffmanTree[i] = new HuffNode(0,-1,-1,-1);}}//初始化一个huffmanCodepublic static void initHuffmanCode(Code[] huffmanCode,int n){for(int i=0;i<n;i++){huffmanCode[i]=new Code("","");}}//获取huffmanCode的符号public static void getHuffmanCode(Code[] huffmanCode , int n){Scanner input = new Scanner(System.in);for(int i=0;i<n;i++){String temp = input.next();huffmanCode[i] = new Code(temp,"");}}//获取huffman树节点频数public static void getHuffmanWeight(HuffNode[] huffmanTree , int n){Scanner input = new Scanner(System.in);for(int i=0;i<n;i++){int temp = input.nextInt();huffmanTree[i] = new HuffNode(temp,-1,-1,-1);}}//从n个结点中选取最小的两个结点public static int[] selectMin(HuffNode[] huffmanTree ,int n){int min[] = new int[2];class TempNode{int newWeight;//存储权int place;//存储该结点所在的位置TempNode(int newWeight,int place){this.newWeight=newWeight;this.place=place;}void setNewWeight(int newWeight){this.newWeight=newWeight;}void setPlace(int place){this.place=place;}int getNewWeight(){return newWeight;}int getPlace(){return place;}}TempNode[] tempTree=new TempNode[n];//将huffmanTree中没有双亲的结点存储到tempTree中int i=0,j=0;for(i=0;i<n;i++){if(huffmanTree[i].getParent()==-1&& huffmanTree[i].getWeight()!=0){tempTree[j]= new TempNode(huffmanTree[i].getWeight(),i);j++;}}int m1,m2;m1=m2=0;for(i=0;i<j;i++){if(tempTree[i].getNewWeight()<tempTree[m1].getNewWeight())//此处不让取到相等,是因为结点中有相同权值的时候,m1取最前的m1=i;}for(i=0;i<j;i++){if(m1==m2)m2++;//当m1在第一个位置的时候,m2向后移一位if(tempTree[i].getNewWeight()<=tempTree[m2].getNewWeight()&& i!=m1)//此处取到相等,是让在结点中有相同的权值的时候,//m2取最后的那个。m2=i;}min[0]=tempTree[m1].getPlace();min[1]=tempTree[m2].getPlace();return min;}//创建huffmanTreepublic static void createHaffmanTree(HuffNode[] huffmanTree,int n){if(n<=1)System.out.println("Parameter Error!");int m = 2*n-1;//initHuffmanTree(huffmanTree,m);for(int i=n;i<m;i++){int[] min=selectMin(huffmanTree,i);int min1=min[0];int min2=min[1];huffmanTree[min1].setParent(i);huffmanTree[min2].setParent(i);huffmanTree[i].setLeftChild(min1);huffmanTree[i].setRightChild(min2);huffmanTree[i].setWeight(huffmanTree[min1].getWeight()+ huffmanTree[min2].getWeight());}}//创建huffmanCodepublic static void createHaffmanCode(HuffNode[] huffmanTree,Code[] huffmanCode,int n){Scanner input = new Scanner(System.in);char[] code = new char[10];int start;int c;int parent;int temp;code[n-1]='0';for(int i=0;i<n;i++){StringBuffer stringBuffer = new StringBuffer();start=n-1;c=i;while( (parent=huffmanTree[c].getParent()) >=0 ){start--;code[start]=((huffmanTree[parent].getLeftChild()==c)?'0':'1');c=parent;}for(;start<n-1;start++){stringBuffer.append(code[start]);}huffmanCode[i].setCode(stringBuffer.toString());}}//输出hufmanCodepublic static void ouputHaffmanCode(Code[] huffmanCode,int n){System.out.println("字符与编码的对应关系如下:");for(int i=0;i<n;i++){System.out.println(huffmanCode[i].getCharacter()+":"+huffmanCode[i].getCode());}}}

输出结果:

哈夫曼abcdef编码相关推荐

  1. 赫夫曼树编码的算法及应用习题--数据结构

    赫夫曼树编码的算法及应用习题 1.构造赫夫曼树的方法 1.根据给定的n个权值{w1,w2,---wn},构成n棵二叉树的集合F={T1,T2...,Tn},其中每棵二叉树中只有一个带权为Wi的根结点, ...

  2. java哈夫曼树编码_哈夫曼树的编码实验

    Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 建树,造树,编码,解码 一.哈夫曼树编码介绍 1.哈夫曼树: (1)定义:假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子 ...

  3. 哈夫曼树的构建及哈夫曼树编码

    哈夫曼树的构建: 注意:(1).首先把一组数3 5 6 8 9 12 15从小到大排列 (2).选取里面最小2个,顶点出为2个数的和 (3).新产生的顶点在与原先的数字进行比较,在里面选取2个最小的数 ...

  4. labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...

    huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...

  5. Huffman(哈夫曼)编码的C语言实现

    Huffman(哈夫曼)编码的C语言实现 本文将给出C语言的Huffman编码的原理,示例及C语言仿真结果,代码. 一.Huffman编码原理及举例 Huffman编码是一种信源编码,其编码目的在于以 ...

  6. 哈夫曼字符串编码c语言实现,基于哈夫曼(haffuman)算法的文件压缩的实现(C语言)(原创)...

    本文首先简要阐述哈夫曼算法的基本思想,然后介绍了使用哈夫曼算法进行文件压缩和解压缩的 处理步骤,最后给出了C语言实现的文件压缩和解压缩的源代码. 哈夫曼算法的主要思想是: ①首先遍历要处理的字符串,得 ...

  7. 哈夫曼树编码与译码(完整C/C++实现代码)

    哈夫曼编码的设计与应用 问题需求分析 用哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法 ...

  8. 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现

    78 /*-----------创建工作---------------------------*/ 79     int s1,s2; 80     for (int i = n + 1; i < ...

  9. 利用哈夫曼树编码与译码

    #include<iostream> #include<string.h> #include<stdlib.h> using namespace std;typed ...

最新文章

  1. c++语言文件流,C++ IO类、文件输入输出、string流详细讲解
  2. 高响应比优先算法代码_以梦为码丨让每一行代码都充满温情
  3. docker容器的重启策略:通过--restart来指定
  4. 速递|2021双11阿里云数据库技术快报
  5. vmware创建虚拟机不识别网卡
  6. 字节流转化为文件流_C#文件转换为字节流及字节流转换为文件
  7. java上传头像插件_JSP+SpringMVC框架使用WebUploader插件实现注册时候头像图片的异步上传功能...
  8. html头部协议,TCP/IP协议头部结构体
  9. PXE远程CentOS安装anaconda报错
  10. 使用Dockerfile构建镜像-Docker for Web Developers(5)
  11. matlab中probIdx = 2 2,利用1stOpt1.5 pro来进行多元非线性拟合
  12. 使用Fastlane编写Android自动打包脚本
  13. struts2从入门到精通
  14. Java开发四年,分享我收藏的网站和资源(不看亏一亿)
  15. 天翼云监控客户pc端及手机端下载安装教程
  16. 一个男人,给他女朋友的男朋友的一封信
  17. android 内部存储 其他,小米MIUI系统怎么清除内部储存空间中“其他”数据?
  18. 虚拟化最大的市场将出现在3G手机领域
  19. 手机号注册过,被遗忘的网站有哪些?
  20. 广东取消英语和计算机考试,广东紧急停考通知!全国英语等级考试、全国计算机等级考试停考...

热门文章

  1. 深入理解Linux网络学习总结
  2. 一款全能的下载工具Motrix,支持BT、磁力链、百度网盘等资源
  3. 在DB2中创建第一个触发器
  4. IO-BIO-NIO-AIO
  5. 软路由系统 --- OpenWrt下载安装中文语言包
  6. python一维数组和二维数组_Python numpy实现二维数组和一维数组拼接的方法
  7. 跑腿app要有哪些功能呢?
  8. conda更换清华源
  9. Springboot毕设项目消防安全知识普及平台9rv4qjava+VUE+Mybatis+Maven+Mysql+sprnig)
  10. 我把谷歌bookmarks用记事本改了一下