求一段字符串中字符对应的赫夫曼编码

 public static void HfCodes(StringBuilder builder,String path,spot root){  //真正的得到字符对应的赫夫曼编码
        StringBuilder stringBuilder = new StringBuilder(builder);
                 stringBuilder.append(path);
                 if (root!=null){
                     if (root.data==null){
                         HfCodes(stringBuilder, "0", root.left);
                         HfCodes(stringBuilder, "1", root.right);   //归的时候仍会用这个时候的stringBuilder,只是再加上1而已,不会反向
                     }else {
                            Hfcode.put(root.data, stringBuilder.toString());  //因为哈夫曼编码的前缀性,所以每个实际记录数据的节点前面的路径上都是data=null的节点
                     }
                 }
    }
    
    public static List<spot> getNodes(byte[] bytes){   //得到一个存放着字符和对应权重(使用频率)的ertry 的 list
        HashMap<Byte, Integer> hashMap = new HashMap<>();
        for (byte b:bytes){
            Integer weight = hashMap.get(b);
            if (weight==null){
                hashMap.put(b,1);
            }else {
                hashMap.put(b,weight+1);
            }
        }
        ArrayList<spot> nodes = new ArrayList<>();
        for (Map.Entry<Byte,Integer> entry:hashMap.entrySet()){    //由于map没有迭代器所以需要通过entryset()转换为set集合,其中每个子元素类型都是map.entry (键值对)
                  nodes.add(new spot(entry.getKey(),entry.getValue()));
        }
        return nodes;
    }
    
  public static spot HfTree(List<spot> nodes){
        while (nodes.size()>1){
            Collections.sort(nodes);
            spot left = nodes.get(0);
            spot right=nodes.get(1);
            spot root = new spot(null, left.weight + right.weight);
            root.left=left;
            root.right=right;
//            nodes.remove(0);   //最后一次循环,即当size==1时,把0删了之后size==1,此时再删就会造成溢出
//            nodes.remove(1);
            nodes.remove(left);
            nodes.remove(right);
            nodes.add(root);
        }
        return nodes.get(0);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值