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) ...
随机推荐
- DataGridView常用操作
一.DataGridView列右击菜单事件处理 (1). 添加一个快捷菜单contextMenuStrip1:(2). 给dataGridView1的CellMouseDown事件添加处理程序: pr ...
- FLASH CC 2015 CANVAS 导出图片出现缩放问题
最近有项目 没时间更新教程 刚才出现一个问题 就是导出动画后,发现有图片无故被缩放(与软件内的设置不一样) 经过排查 发现动画师 直接将位图 进行了缩放, 导出后出现问题 把文图转换为影片剪辑后,做缩 ...
- FLASH CC 2015 CANVAS (三) flash中写JS调用html中JS的函数,变量
注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 首先我们在HTML里的JS里面添加几行代码 我们在FLASH中新建一个元件,并拖入到舞台,在属性面板 ...
- read 隐藏用户输入
有时会需要脚本用户进行输入,但不希望输入的数据显示在监视器上,典型的例子就是输入密码,当然还有很多其它类型的数据需要隐藏.-s选项就能够使read命令中输入的数据不现实在监视器上(实际上,数据是显示的 ...
- 上不了Google是码农的悲哀
http://refyt.com/?r=34d1edb7dba42e8d 上不了Google是码农的悲哀.1. 资料大部分都在国外的网站,差不多倍感伤心.2. Google Play没有办法访问了.3 ...
- 2013 Multi-University Training Contest 1
HDU-4605 Magic Ball Game 题意:给定一颗以1为根的数,每个节点要么有两个孩子节点,要么没有孩子,每个节点有一个重量,现在从节点1往下放置一个小球,根据小球和节点的重量的不同球落 ...
- 动态CSS--less
忙了很久终于有时间来写点东西了,不知道大家有没有发现,我们在写CSS的时候总是在重复很多代码,一个相同的属性值往往要重复N次,以前我就经常想有没有什么办法能让我们不用一直重复的font-size啊co ...
- 笔记本_thinkpad_e40
1. 0578A69 2.驱动下载 相关地址 XPhttp://think.lenovo.com.cn/support/driver/detail.aspx?docID=DR1253259153348 ...
- 没办法,还是要补一下js,回调函数(转载)
<html> <head> <title>回调函数(callback)</title> <script language="javasc ...
- 使用Nexus搭建Maven私服
1. 环境搭建 1.1 下载 http://www.sonatype.org/nexus/ NEXUS OSS [OSS = Open Source Software,开源软件--免费] NE ...