哈弗曼编码的java实现(贪心算法)

具体问题描述以及C/C++实现参见网址

http://blog.csdn.net/liufeng_king/article/details/8720896

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* 哈弗曼树(贪心算法)

* @author Lican

*

*/

public class Huffman implements Comparable {

Bintree tree;

float weight;

String coding;

public Huffman(Bintree tree,float weight){

this.tree=tree;

this.weight=weight;

}

@Override

public int compareTo(Object x) {

float w=((Huffman)x).weight;

if(this.weight

if(this.weight==w) return 0;

return 1;

}

/**

* 二叉树类

* @author Lican

*

*/

public static class Bintree{

public Bintree Left;

public Bintree Right;

public String data;

public String coding;

public Bintree(Bintree l,Bintree r,String data){

this.Left=l;

this.Right=r;

this.data=data;

}

public String getCoding() {

return coding;

}

public void setCoding(String coding) {

this.coding = coding;

}

}

/**

* 创建Huffman树

* @param h

* @return

*/

public static Huffman createHuffmanTree(List h){

while(h.size()>1){

Collections.sort(h);

Huffman h1=h.get(0);

Huffman h2=h.get(1);

float w=h1.weight+h2.weight;

Bintree b1=h1.tree;

Bintree b2=h2.tree;

Bintree b=new Bintree(b1,b2,"");

Huffman node=new Huffman(b,w);

h.remove(0);

h.remove(0);

h.add(node);

}

return h.get(0);

}

/**

* 根据树来编码,左子树分配0,右子树分配1

* @param node

* @param str

*/

public static void process(Bintree node,String str){

//叶子结点

if(node.Left==null){

node.setCoding(str);

System.out.println(node.data+": "+node.coding);

return;

}

//对左子树分配代码"0"

process(node.Left,str+"0");

//对右子树分配代码"1"

process(node.Right,str+"1");

}

public static void main(String[] args) {

List h=new ArrayList();

Bintree b1=new Bintree(null,null,"A");

Huffman h1=new Huffman(b1,40);

h.add(h1);

Bintree b2=new Bintree(null,null,"B");

Huffman h2=new Huffman(b2,8);

h.add(h2);

Bintree b3=new Bintree(null,null,"C");

Huffman h3=new Huffman(b3,10);

h.add(h3);

Bintree b4=new Bintree(null,null,"D");

Huffman h4=new Huffman(b4,30);

h.add(h4);

Bintree b5=new Bintree(null,null,"E");

Huffman h5=new Huffman(b5,10);

h.add(h5);

Bintree b6=new Bintree(null,null,"F");

Huffman h6=new Huffman(b6,2);

h.add(h6);

Huffman root=createHuffmanTree(h);

process(root.tree,"");

}

}

/**

A: 0

D: 10

F: 1100

B: 1101

C: 1110

E: 1111

*/

贪心算法实例java,算法java实现--贪心算法--哈弗曼编码相关推荐

  1. java归并算法实例_Java编程中实现归并排序算法的实例教程

    算法概述/思路归并排序是基于一种被称为"分治"(divide and conquer)的策略.其基本思路是这样的: 1.对于两个有序的数组,要将其合并为一个有序数组,我们可以很容易 ...

  2. 哈夫曼编码压缩率计算_程序员的算法课(8)-贪心算法:理解霍夫曼编码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37609579/article/ ...

  3. 程序员的算法课(8)-贪心算法:理解霍夫曼编码

    一.一种很贪婪的算法定义 贪心是人类自带的能力,贪心算法是在贪心决策上进行统筹规划的统称. [百度百科]贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体 ...

  4. python贪心算法几个经典例子_关于贪心算法的一些探讨、经典问题的解决和三种典型的贪心算法算法(哈弗曼,Kruskal,Prim)的Python实现。...

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 贪心算法不是对所有问题都能得到整体最优解,关键是 ...

  5. 贪心算法哈夫曼编码c语言,贪心算法详解:哈夫曼编码

    理解贪心算法 贪心算法是一种算法思想,并不是一个具体的算法,因此我们用两个例子来理解什么样的问题适合用贪心算法解决. 例一 现在有一个能装 100g 物品的背包,和一些可拆分的物品(见表格),怎么装才 ...

  6. 聚类算法-最大最小距离算法(实例+代码)

    聚类算法-最大最小距离算法(实例+代码) [尊重原创,转载请注明出处]http://blog.csdn.net/guyuealian/article/details/53708042 目录 聚类算法- ...

  7. linux加密框架 crypto 算法管理 - 创建哈希算法实例

    crypto_alloc_ahash函数 加密框架中的哈希算法可以是同步方式实现的也可以是异步方式实现的,但是算法应用不关注哈希算法的实现方式,关注的是哈希算法提供的算法接口.为实现统一管理,加密框架 ...

  8. 哈夫曼编码(Huffman)Java实现代码简化版

    这个网上发现的Huffuman编码Java实现在组织上相对简化,便于理解文件压缩过程:提取文件统计字符频度-根据字符频度创建huffman树-根据huffman树生成huffman可变字长无前缀编码- ...

  9. 哈夫曼编码(Huffman)Java实现代码

    网上找到的一个组Huffman编码Java实现代码,比较经典. 1.主类,压缩和解压 package cn.hm;import java.io.BufferedInputStream; import ...

  10. 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法

    第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...

最新文章

  1. Express应用配置端口
  2. Java多种方式读文件,追加文件内容,等对文件的各种操作
  3. 网络工程师_记录的一些真题_2005上半年上午
  4. lucene集成IK实现中文分词检索
  5. Logistic Classification
  6. 重磅!神策数据游戏行业解决方案全面上线,速来围观
  7. arm集群服务器_百度云智峰会发布ARM私有云新品,加速企业在移动端上的数字化转型...
  8. 教你50招提升ASP.NET性能(十五):解决性能问题时不要低估UI的价值
  9. java 日期calendar_java时间对象Date,Calendar和LocalDate/LocalDateTime
  10. 没有光驱怎样从硬盘上安装Windows XP系统
  11. Java基础学习总结(43)——Java8 Lambda揭秘
  12. 如何表达清楚一个程序:模块化设计
  13. 在vs中创建Analysis Services项目
  14. 怎么改java游戏_jar游戏按键修改,怎么修改jar游戏按键
  15. Adapter 模式
  16. 小班同学学习经历分享(一)游戏程序员成长札记
  17. IDEA社区版配置Spring Boot开发
  18. 电脑裸奔-中木马-QQ被盗-大团圆结局(QQ申诉艰难旅程)
  19. 记录下Tesla V100s vmware EXTI 7.0 虚拟机直通显卡cuda、cudnn安装
  20. 神经网络方法研究及应用,神经网络算法实例说明

热门文章

  1. mac设置多个屏幕显示的问题
  2. SpringMVC环境搭建——HelloWorld
  3. 如何开发一个完整的JavaScript组件
  4. 第十章 Scala 容器基础(二十二):合并有序集合
  5. Linux 简单的双线设置
  6. tomcat设置独立jvm的例子
  7. Java实现棒子老虎鸡小游戏
  8. linux中swap的权限,有关 Linux Swap
  9. Android通讯录怎么实现定位,Android仿微信通讯录滑动快速定位功能
  10. hashmap 存取原理图_HashMap原理(二) 扩容机制及存取原理