哈夫曼abcdef编码

1、 哈夫曼编码问题

我们希望压缩一个10万个字符的数据文件,下图给出文件中所出现的字符和他们的出现频率。

字符 频率(千次)
a 45
b 13
c 12
d 16
e 9
f 5

考虑一种二进制编码,每个字符用一个唯一的二进制串表示,给出压缩率最好的编码方式,也即字符的最优二进制表示。

java代码实现:

结构:
在这里插入图片描述
main函数:

package com;

import com.TreeCode.Code;
import com.TreeCode.HuffNode;
import com.TreeCode.HuffmanTree;

import java.util.Scanner;

public class Main {
   

    public static void main(String[] args) {
   
   // write your code here
        Scanner input = new Scanner(System.in);
        int n,m;
        System.out.print("请输入字符个数:");
        n = input.nextInt();
        m=2*n-1;
        HuffmanTree huffmanTree=new HuffmanTree();
        HuffNode[] huffmanTreeNodes = new HuffNode[m];
        Code[] huffmanCode = new Code[n];

        //初始化huffmanTree,huffmanCode
        huffmanTree.initHuffmanTree(huffmanTreeNodes,m);
        huffmanTree.initHuffmanCode(huffmanCode,n);
        //获取huffmanCode的符号
        System.out.print("请输入哈夫曼编码的字符:");
        huffmanTree.getHuffmanCode(huffmanCode,n);
        //获取huffmanTree的频数
        System.out.print("请输入哈夫曼编码字符对应的频数:");
        huffmanTree.getHuffmanWeight(huffmanTreeNodes,n);
        //创建huffmanTree
        huffmanTree.createHaffmanTree(huffmanTreeNodes,n);
        //创建huffmanCode
        huffmanTree.createHaffmanCode(huffmanTreeNodes,huffmanCode,n);
        //输出huffmanCode编码
        huffmanTree.ouputHaffmanCode(huffmanCode,n);
    }
}

哈夫曼编码类:

package com.TreeCode;

public class Code
{
   
    String character;
    String code;
    Code(String character,String code){
   
        this.character=character;
        this.code=code;
    }
    Code(String code){
   
        this.code= code;
    }

    public String getCharacter() {
   
        return character;
    }

    public void setCharacter(String character) {
   
        this.character = character;
    }

    public String getCode() {
   
        return
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先需要计算每个字符的出现频率,并按照频率从小到大构建一颗哈夫曼树。假设每个字符的频率分别为a:15,b:19,c:10,d:6,e:38,f:12。则构建哈夫曼树的过程如下: 1. 将所有字符看作一个个节点,按照频率从小到大排序,得到d、c、f、a、b、e。 2. 取出频率最小的两个节点d和c,合并成一个新的节点dc,权值为16(d的权值为6,c的权值为10)。 3. 将dc插入到原节点序列中,得到dc、f、a、b、e。 4. 取出频率最小的两个节点dc和f,合并成一个新的节点dcf,权值为28(dc的权值为16,f的权值为12)。 5. 将dcf插入到原节点序列中,得到dcf、a、b、e。 6. 取出频率最小的两个节点dcf和a,合并成一个新的节点dcfa,权值为43(dcf的权值为28,a的权值为15)。 7. 将dcfa插入到原节点序列中,得到dcfa、b、e。 8. 取出频率最小的两个节点dcfa和b,合并成一个新的节点dcfab,权值为62(dcfa的权值为43,b的权值为19)。 9. 将dcfab插入到原节点序列中,得到dcfab、e。 10. 最后,将剩余的两个节点dcfab和e合并成一个新的节点dcfabe,权值为100(dcfab的权值为62,e的权值为38)。 11. 构建完成的哈夫曼树如下所示: ``` d:6 c:10 f:12 a:15 b:19 e:38 \ / | | | \ / | | | dc:16 | | | \ | | | \ | | | dcf:28 | | | \ | | | \ | | | dcfa:43 | | \ | | \ | | dcfab:62 | \ | \ | dcfabe:100 ``` 接下来,我们可以根据构建好的哈夫曼树来计算每个字符的哈夫曼编码。从根节点开始,向左走为0,向右走为1,直到到达叶子节点,即为该字符的哈夫曼编码。例如,字符a的编码为10,字符b的编码为110,字符c的编码为1101,字符d的编码为1100,字符e的编码为0,字符f的编码为100。最后输出带权路径长度240和每个字符对应的哈夫曼编码即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值