贪心算法实例java,算法java实现--贪心算法--哈弗曼编码

哈弗曼编码的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

*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值