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 常用Response.ContentType
来源:http://blog.csdn.net/navy235/article/details/5982319 不同的ContentType 会影响客户端所看到的效果.默认的ContentType为 ...
- Ubuntu Install Chrome Brwoser
在ubuntu下安装chrome浏览器,可以直接从官网下载:http://www.google.cn/intl/zh-CN/chrome/browser/thankyou.html?platform= ...
- poj3608Bridge Across Islands(凸包间最小距离)
链接 以下所有文章均转载( http://blog.csdn.net/acmaker/article/details/3176910) 转载请注明出处! 考虑如下的算法, 算法的输入是两个分别有 m ...
- .net 连接sqlserver类库
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...
- Java中的JDBC数据库连接
JDBC编程步骤 1.加载数据库驱动. // 加载驱动 Class.forName(driverClass) // 加载mysql驱动 Class.forName("com.mysql.jd ...
- centos 解压rar文件
默认情况下centos是不支持winrar的解压与打包的,需要安装winrar的linux版本程序 首先得下载解压软件 wget http://www.rarsoft.com/rar/rarlinux ...
- 转:strcat与strcpy与strcmp与strlen
转自:http://blog.chinaunix.net/uid-24194439-id-90782.html strcat 原型:extern char *strcat(char *dest,cha ...
- spring @ExceptionHandler注解方式实现异常统一处理
首先,在我们的工程中新建BaseController父类,内容如下: package com.ztesoft.zsmartcity.framework.exception; import java.i ...
- 不能上传文件 unknown error happened
做一件事情: 1 找出问题,发现问题,2 搜索问题,3 找到答案,验证之.4 找不到答案,想出思路,验证....5 不断想,记录笔记.
- UAT 环境
User Accept Environment 用户仿真测试环境