构造Huffman以及实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了构造Huffman以及实现相关的知识,希望对你有一定的参考价值。

构造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以及实现的主要内容,如果未能解决你的问题,请参考以下文章

Huffman树的构造及编码与译码的实现

数据结构-----哈夫曼树的构造以及遍历

深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

Java- 哈夫曼(Huffman)压缩算法

Huffman的应用之文件压缩与解压缩