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) ... 
随机推荐
- .NET在后置代码中输入JS提示语句(背景不会变白)
			来源:http://niunan.iteye.com/blog/248256 Page.ClientScript.RegisterStartupScript(Page.GetType(), " ... 
- FLASH CC 2015 CANVAS (一) 与AS3的写法区别
			注意 此贴 为个人边“开荒”边写,所以不保证就是最佳做法,也难免有错误! 正式教程会在后续开始更新 AS3 JS stop() this.stop(); mc.stop() this.mc.stop( ... 
- spring的自动装配(default-autowire="byName")
			自动装配,官方给出的定义是这样:Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自 动让Spring通过检查BeanFactory中的内 ... 
- php笔记[2]
			strlen()函数获得字符窜的长度 读取文件:fgets(),fgetss()和fgetcsv() 读取整个文件:readfile(),fpassthru()和file() 读取一个字符:fgetc ... 
- [转载] Linux进程关系
			在工作中, 主进程创建了子进程, 而子进程又创建了孙子进程, 然而子进程被莫名其妙的 kill 了, 结果主进程又启动了一个子进程, 子进程又尝试创建孙子进程, 但是这时候就有问题了, 因为孙子进程还 ... 
- OC正则表达式的简单使用
			最近落实工作的事情后终于有时间可以写博客了 今天带来的是正则表达式的一般使用方法 我们平时在对字符串构成就行判断的时候,一般利用其单个字符进行条件判断 但如果判断的条件稍微复杂一点,那对单个字符判断就 ... 
- 转	git使用命令, 特别:git checkout -b a 与 git branch a区别
			创建分支: $ git branch mybranch 切换分支: $ git checkout mybranch 创建并切换分支: $ git checkout -b mybranch 更新mast ... 
- JavaWeb学习总结(十三)--数据库连接池
			一.数据库连接池的概念 用池来管理Connection,这可以重复使用Connection.有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Co ... 
- String.join()方法的使用
			String.join()方法是JDK1.8之后新增的一个静态方法,使用方式如下所示: String result = String.join("-","java&qu ... 
- Linux下的split 命令(将一个大文件根据行数平均分成若干个小文件)
			将一个大文件分成若干个小文件方法 例如将一个BLM.txt文件分成前缀为 BLM_ 的1000个小文件,后缀为系数形式,且后缀为4位数字形式 先利用 wc -l BLM.txt 读出 BL ... 
