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) ...
随机推荐
- SQL查询语句 group by后, 字符串合并
合并列值 --******************************************************************************************* 表 ...
- ZOJ-2342 Roads 二分图最小权值覆盖
题意:给定N个点,M条边,M >= N-1.已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少? 分析:由于计算 ...
- poj2354Titanic(两点的球面距离)
链接 球面距离计算公式:d(x1,y1,x2,y2)=r*arccos(sin(x1)*sin(x2)+cos(x1)*cos(x2)*cos(y1-y2)) x1,y1是纬度\经度的弧度单位,r为地 ...
- 手动导出Excel方法
private void dgJiBingZhenDuanBind() { Response.Clear(); Response.Charset = "GB2312"; Res ...
- TCP及IP报头及协议
看到有道题目要问:tcp头多少字节?哪些字段?(必问) 这个... 看了这篇文章做参考:http://blog.163.com/tianshuai11@126/blog/static/61894543 ...
- Android照相机模块编程 照片颠倒问题及查询摄像头参数问题的解决
这两天编程弄Android照相机模块,设置好各种参数后,发现预览的时候,照片是颠倒了,不是上下颠倒而是颠倒90°. 我的手机是华为U9200,用的Android4.0.3,后来看到http://www ...
- 让Fiddler能够检测到localhost的http数据
用 vs.net开发调试网站程序时经常有这样的地址: http://localhost:2033/ 然而在开启 Fiddler 后会发现Fiddler 完全抓不到任何封包. 主要的原因是因为 Fidd ...
- Java中的Double类型计算
一.问题的提出: 如果我们编译运行下面这个程序会看到什么?public class Test{ public static void main(String args[]){ Sy ...
- scp lost connection
将本机的文件copy到远程时, scp -r /home/Projects/test.rpm root@172.1.1.1:/root; 我们得到了一个错误:lost connection lost ...
- C# Socket编程(5)使用TCP Socket
TCP 协议(Transmission Control Protocol,传输控制协议)是TCP/IP体系中面向连接(connection oriented)的传输层(transport layer) ...