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);
}
求一段字符串中字符对应的赫夫曼编码
最新推荐文章于 2022-11-08 22:53:14 发布