Huffman树与编码的简单实现
好久没写代码了,这个是一个朋友问的要C实现,由于不会C,就用JAVA写了个简单的。注释掉的代码属性按照原来朋友发的题里带的参数,发现没什么用就给注释掉了。
package other;
import java.util.HashMap;
public class Huffman {
public static Bean huffmanBean = new Bean();
public static HuffCode huff=new HuffCode();
public static void main(String[] args) {
Bean[] beans = initD();
beans = arrSort(beans);
getHuffmanT(beans);
getHuffmanCode(huffmanBean,0);
}
public static void getHuffmanCode(Bean node,int c){
if(node.getLeft()!=null){
huff.put(c,0);
getHuffmanCode(node.getLeft(), c + 1);
}
if(node.getName()!=null)
System.out.println("节点名:"+node.getName()+" 概率值:"+String.valueOf(node.getProb())+" 哈夫曼编码值:"+huff.toString().substring(0,c));
if(node.getRight()!=null){
huff.put(c,1);
getHuffmanCode(node.getRight(), c + 1);
}
}
/**
* 获取Huffman树
* @param beans
*/
public static void getHuffmanT(Bean[] beans){
while(beans.length>1){
Bean tempBean = getBeanRoot(beans);
Bean[] nBeans = arrInsert(beans,tempBean);
getHuffmanT(nBeans);
if(nBeans.length==1){
huffmanBean = nBeans[0];
}
break;
}
}
/**
* 获取最小值和后的新节点
* @param beans
* @return
*/
public static Bean getBeanRoot(Bean[] beans){
Bean newBean = new Bean();
newBean.setProb(beans[beans.length-1].getProb()+beans[beans.length-2].getProb());
newBean.setLeft(beans[beans.length-2]);
newBean.setRight(beans[beans.length-1]);
beans[beans.length-1].setParent(newBean);
// beans[beans.length-1].setNum("1");
beans[beans.length-2].setParent(newBean);
// beans[beans.length-2].setNum("0");
return newBean;
}
/**
* 插入后重排序
* 可以改成直接插入
* @param beans
* @param bean
* @return
*/
public static Bean[] arrInsert(Bean[] beans,Bean bean){
Bean[] nBeans = new Bean[beans.length-1];
for (int i = 0; i < beans.length-2; i++) {
nBeans[i]=beans[i];
}
nBeans[nBeans.length-1] = bean;
nBeans = arrSort(nBeans);
return nBeans;
}
/**
* 冒泡排序
* @param bean
* @return
*/
public static Bean[] arrSort(Bean[] bean){
for (int i = 0; i < bean.length; i++) {
for (int j = i+1; j < bean.length; j++) {
if (bean[j].getProb()>bean[i].getProb()) {
Bean temp = new Bean();
temp=bean[j];
bean[j]=bean[i];
bean[i]=temp;
}
}
}
return bean;
}
/**
* 初始化测试数据
* @return
*/
public static Bean[] initD(){
Bean b1 = new Bean("a",0.2f);
Bean b2 = new Bean("b",0.19f);
Bean b3 = new Bean("c",0.18f);
Bean b4 = new Bean("d",0.17f);
Bean b5 = new Bean("e",0.15f);
Bean b6 = new Bean("f",0.1f);
Bean b7 = new Bean("g",0.01f);
Bean[] bean = new Bean[]{b1,b2,b3,b4,b5,b7,b6};
return bean;
}
}
class HuffCode extends HashMap{
public String toString(){
String str="";
for(int i=0;i<this.size();i++){
str+=this.get(i);
}
return str;
}
}
class Bean{
private Bean left;
private Bean right;
// private Bean next;
private Bean parent;
private float prob;
// private String num;
private String name;
public Bean(){
}
public Bean(String name,float prob){
this.prob = prob;
this.name = name;
}
public Bean getLeft() {
return left;
}
public void setLeft(Bean left) {
this.left = left;
}
public Bean getRight() {
return right;
}
public void setRight(Bean right) {
this.right = right;
}
// public Bean getNext() {
// return next;
// }
// public void setNext(Bean next) {
// this.next = next;
// }
public Bean getParent() {
return parent;
}
public void setParent(Bean parent) {
this.parent = parent;
}
public float getProb() {
return prob;
}
public void setProb(float prob) {
this.prob = prob;
}
// public String getNum() {
// return num;
// }
// public void setNum(String num) {
// this.num = num;
// }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Huffman树与编码的简单实现的更多相关文章
- Huffman树的编码译码
上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...
- Huffman树与编码
带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = ...
- Huffman树进行编码和译码
//编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...
- Huffman树及其编码(STL array实现)
这篇随笔主要是Huffman编码,构建哈夫曼树有各种各样的实现方法,如优先队列,数组构成的树等,但本质都是堆. 这里我用数组来存储数据,以堆的思想来构建一个哈弗曼树,并存入vector中,进而实现哈夫 ...
- Huffman树及其编解码
Huffman树--编解码 介绍: Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...
- 构造数列Huffman树总耗费_蓝桥杯
快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...
- Java蓝桥杯练习题——Huffman树
Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...
- Huffman树的构造及编码与译码的实现
哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...
- Huffman编码(Huffman树)
[0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...
随机推荐
- iOS案例:读取指定txt文件,并把文件中的内容输出出来
用到的是NSString中的initWithContentsOfFile: encoding方法 // // main.m // 读取指定文件并输出内容 // // Created by Apple ...
- 常见的PC端和移动端表单组件
http://files.cnblogs.com/samwu/PC%E7%AB%AF%E5%89%8D%E7%AB%AF%E4%BA%A4%E4%BA%92%E7%BB%84%E4%BB%B6.rar
- MongoDB开发学习
如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四 ...
- ACCESS 数据库使用配置调整解决方案
分享到 一键分享 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 64位服务器无法使用ac ...
- JavaScript删除-confirm
一> onclick="javascript:if (confirm('您确定要删除吗?注意:此操作不可恢复,请谨慎操作!')){return true;} return false; ...
- 进程&线程
进程与线程的区别 什么是进程(Process):普通的解释就是,进程是程序的一次执行,而什么是线程(Thread),线程可以理解为进程中的执行的一段程序片段.在一个多任务环境中下面的概念可以帮助我们理 ...
- c#获取url请求的返回值(转)
有两种方式获取. 方法一: /// <summary> /// 获取url的返回值 /// </summary> /// <param name="url&qu ...
- Oracle存储过程中异步调用的实际操作步骤
本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用 .而有些相关的业务逻辑 ...
- keepalived的安装和使用
IP配置 管理IP地址 角色 备注 网卡 192.168.1.114 主调度器(Director) 对外提供VIP服务的地址为192.168.1.88 eth1 192.168.1.205 备用调度器 ...
- Could not obtain connection metadata
用hibernate连接数据库出现错误 2010-3-16 17:23:39, 093 [main] WARN [org.hibernate.cfg.SettingsFactory] - Could ...