好久没写代码了,这个是一个朋友问的要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树与编码的简单实现的更多相关文章

  1. Huffman树的编码译码

    上个学期做的课程设计,关于Huffman树的编码译码. 要求: 输入Huffman树各个叶结点的字符和权值,建立Huffman树并执行编码操作 输入一行仅由01组成的电文字符串,根据建立的Huffma ...

  2. Huffman树与编码

    带权路径最小的二叉树称为最优二叉树或Huffman(哈夫曼树). Huffman树的构造 将节点的权值存入数组中,由数组开始构造Huffman树.初始化指针数组,指针指向含有权值的孤立节点. b = ...

  3. Huffman树进行编码和译码

    //编码#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> ...

  4. Huffman树及其编码(STL array实现)

    这篇随笔主要是Huffman编码,构建哈夫曼树有各种各样的实现方法,如优先队列,数组构成的树等,但本质都是堆. 这里我用数组来存储数据,以堆的思想来构建一个哈弗曼树,并存入vector中,进而实现哈夫 ...

  5. Huffman树及其编解码

    Huffman树--编解码 介绍:   Huffman树可以根据输入的字符串中某个字符出现的次数来给某个字符设定一个权值,然后可以根据权值的大小给一个给定的字符串编码,或者对一串编码进行解码,可以用于 ...

  6. 构造数列Huffman树总耗费_蓝桥杯

    快排! /** 问题描述 Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的 ...

  7. Java蓝桥杯练习题——Huffman树

    Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. 给出一列数{pi}={p0, p1, -, pn-1},用这列数构造Huffman树的过程如下: 找到{pi}中 ...

  8. Huffman树的构造及编码与译码的实现

    哈夫曼树介绍 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数) ...

  9. Huffman编码(Huffman树)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 "Huffman编码(Huffman树)" 的idea 并用源代码加以实现: 0.2) ...

随机推荐

  1. 拓扑排序--UVa10305

    题目 Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n tasks to do. Unfortun ...

  2. LINQ之路 3:C# 3.0的语言功能(下)

    在LINQ介绍一篇中,我们已经看到了隐式类型变量var,扩展方法(Extension method)和Lambda表达式的身影.没错,他们正是LINQ技术的基石,是他们让LINQ的实现成为可能,并且简 ...

  3. JMS【二】--ActiveMQ简单介绍以及安装

    现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...

  4. python中if __name__ == '__main__'

    python 中__name__ = '__main__' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: “Make a script both importable and execut ...

  5. Android 让输入框输入指定字符的办法

    让输入框输入指定字符的办法 有一个需求 让输入密码的时候只能输入数字字母可见字符 不能输入中文 之前还以为要写代码 还来发现有一个属性可以直接实现 <EditText android:layou ...

  6. ios 开发之 Xcode6 No valid signing identities (i.e. certificate and private key pair) matching...

    之前的项目用证书真机测试过,我想再无证书Build,出现下面的报错提示! 下面的team我无法改成None!一点击None选的还是Unhonw name(JPGE28K3W9)这个是报错的关键 最后由 ...

  7. white-space: nowrap

    CSS:需要加上宽度(width:100px).超出隐藏(overflow:hidden;).强制在同一行显示(white-space: nowrap;).省略号(text-overflow:elli ...

  8. for循环与for in循环

    json是js里的一种数据格式.var obj={a:15,b:8,c:12} json数组对象 var arr=[15,8,12]; 数组alert(obj.a); ---15alert(obj[' ...

  9. google_apactest_round_A_problem_D

    先尝试过小数据 题目 有8张卡牌,每个卡牌都可以有不同的等级,每个卡牌的不同等级具有不同的攻击力,可以通过花钱给卡牌充值从而升级,且每次只能升一级,比如可以花1个硬币将卡牌2从1级升级到2级,同时卡牌 ...

  10. 什么是cname a记录

    https://support.dnsimple.com/articles/cname-record/ CNAME就是别名记录,就是负责跳转,比如你给某个地址设置了一个cname,那当访问那个cnam ...