码迷,mamicode.com
首页 > 其他好文 > 详细

Huffman树与Huffman编码

时间:2017-10-08 12:59:21      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:data   [1]   节点   image   man   复习   node   add   huffman   

  • 1.Huffman树

今天复习Huffman树。依稀记得自己被Huffman树虐的经历。还记得是7月份,我刚开始看数据结构与算法,根本看不懂Huffman树的操作。后来我终于悟出了Huffman树是怎么操作的了,但是被C艹的指针虐:用C艹的CArray存贮结点,但是读出来是空的。这是因为当时使用了“CBTtree node;”这样的声明方式,因为C艹的变量的生命周期,一个语句块或者一个循环结束后node就被释放了。所以改为“ CBTtree * node = new CBTtree; ”就没有问题了。

后面又出现了一个逻辑盲区,就是在对CArray进行删除结点操作的时候,没有 “ if(pos[0]<pos[1]) pos[1]--; ”语句,导致删除了错误的结点或者越界错误。

Java code:

 1     void Huffman(int []nums){
 2         int len=nums.length;
 3         int i;
 4         List<BTNode> nodes=new ArrayList<BTNode>();
 5         for(i=0;i<len;i++){
 6             BTNode node=new BTNode(nums[i]);
 7             nodes.add(node);
 8         }
 9         while(nodes.size()>1){
10             int pos[]={0,0};
11             int min[]={0x7FFFFFFF,0x7FFFFFFF};    //index=0: 最小 , index=1: 次小 
12             for(i=0;i<nodes.size();i++){
13                 int value=Integer.parseInt(nodes.get(i).data);
14                 if(value<min[0]){
15                     min[1]=min[0];//传递,最小值被占据,理应把原来的最小值传给次小值
16                     pos[1]=pos[0];
17                     min[0]=value;
18                     pos[0]=i;
19                 }else if(value<min[1]){//通过 else if 语句,说明次小值是大于最小值,但是小于原次小值的
20                     min[1]=value;
21                     pos[1]=i;
22                 }
23             }
24             //将两个最小的节点取出,用他们的之的和形成一个新的节点
25             BTNode parent=new BTNode();
26             parent.data=String.valueOf(min[0]+min[1]);
27             parent.lChild=nodes.get(pos[0]);
28             parent.rChild=nodes.get(pos[1]);
29             //将两个节点取出
30             nodes.remove(pos[0]);
31             if(pos[0]<pos[1]) pos[1]--;//☆☆如果出现这个逻辑盲点,将导致代码出错
32             nodes.remove(pos[1]);
33             nodes.add(parent);
34         }
35         root=nodes.get(0);
36     }

输入:5,3,7,8,11,14,23,29

输出:

技术分享


 

  • 2.Huffman编码

前缀编码:任一个编码都不是另一个字符编码的前缀

1     void HuffmanCode(BTNode parent,String code){
2         if(parent.lChild==null) {System.out.println(parent.data+" : "+code);return;}
3         else HuffmanCode(parent.lChild,code+"0");
4         if(parent.rChild==null) {System.out.println(parent.data+" : "+code);return;}
5         else HuffmanCode(parent.rChild,code+"1");
6     }

输入:

5,3,7,8,11,14,23,29

输出:

技术分享

 

Huffman树与Huffman编码

标签:data   [1]   节点   image   man   复习   node   add   huffman   

原文地址:http://www.cnblogs.com/TQCAI/p/7637033.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!