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

构造Huffman以及实现

时间:2017-12-16 17:21:22      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:trim   字符集   静态   编码   技术分享   错误   alt   etc   哈夫曼   

构造Huffman

题目

在作业本上分别针对权值集合W=(6,5,3,4,60,18,77)和W=(7,2,4,5,8)构造哈夫曼树,提交构造过程的照片

错误回答

技术分享图片

技术分享图片

错误原因:遵循左边小于根右边大于根的原则

正确回答

技术分享图片

HuffmanTree的实现

题目

  • 1、采用静态三叉链表Triment(已经完整实现)储存HuffmanTree
  • 2、理解HuffmanTree的构造过程,不中代码完成decode()
  • 3、在HuffmanTreeTest中补充代码完成上个练习中的内容
  • 4、提交补充代码和运行结果截图

压缩

//数据压缩,将text各字符转换成Huffman编码存储,返回压缩字符串
    public String encode(String text)
    {
        String compressed="";                              //被压缩的数据,以字符串显示
        for (int i=0; i<text.length(); i++)
            compressed += getCode(text.charAt(i)-‘A‘);     //默认字符集是从A开始的n个字符
        return compressed;
    }

解压


    //数据解压缩,将压缩compressed中的0/1序列进行Huffman译码,返回译码字符串
    public String decode(String compressed)
    {
        //依次取出二进制的每一位,从树根向下搜索,1向右,0向左,
        // 到了叶子节点(命中),退回根节点继续重复以上动作
        String uncompressed="";
        char code;

        TriElement node = huftree[huftree.length-1];
        int i=0;
        while(i<compressed.length()) {
            if(!node.isLeaf()){
                code = compressed.charAt(i);
                if (code == ‘0‘) {
                    node = huftree[node.left];
                } else {
                    node = huftree[node.right];
                }
                i++;
            }else if(node.isLeaf()){
                //找到该叶节点的data在权值数组中的位置
                int j=0;
                while(!(node.data == weights[j]))
                    j++;
                //该位置即为该叶节点对应字母在默认字符集中的位置
                uncompressed +=  charset.charAt(j);

                node = huftree[huftree.length-1];
            }
        }
        return uncompressed;
    }

运行结果

技术分享图片

技术分享图片

构造Huffman以及实现

标签:trim   字符集   静态   编码   技术分享   错误   alt   etc   哈夫曼   

原文地址:http://www.cnblogs.com/shuailinzhen/p/8046637.html

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