获取霍夫曼节点的路径
Getting path to Huffman Nodes
我正在尝试从任何文件的字节 [] 中创建霍夫曼树,然后将其压缩。为了创建 BitSequence,我创建了一个字节 HashMap 和对应的字符串值,该字符串值等于它到其节点的路径。手工计算时,我得到的 BitSequence 长度比我的程序输出的要长得多。这是我创建值的 HashMap 的代码,其中 bytes 是该节点的字节值:
public static HashMap<Byte, String> getPath(Node n)
{
HashMap<Byte, String> map = new HashMap<Byte, String>();
buildPath(n, "", map);
return map;
}
public static void buildPath(Node n, String s, HashMap<Byte, String> map) {
if(n != null)
{
if (n.left != null){
buildPath(n.left, s+"0", map);
}
if (n.right != null){
buildPath(n.right, s+"1", map);
}
if(n.left == null && n.right == null)
{
map.put(bytes, s);
return;
}
}
return;
}
然后我遍历文件中的原始字节数组,并使用生成的 HashMap 将霍夫曼路径附加到一个序列,我将用霍夫曼树本身压缩该序列,以便稍后对其进行解码。是我生成路径的方式有误,还是我的问题出在其他地方?
我看到你的方法是静态的,所以我假设可变字节也是。这不会将字节值放入您的 HashMap,而是您将继续将 null 放在那里。摆脱静态,然后它应该正确地将字节值放入映射中。您可以将其设为私有并创建一个像 getByte() 这样 returns 的方法,或者您可以简单地创建字节 public 并使用您正在使用的任何对象调用它。
我正在尝试从任何文件的字节 [] 中创建霍夫曼树,然后将其压缩。为了创建 BitSequence,我创建了一个字节 HashMap 和对应的字符串值,该字符串值等于它到其节点的路径。手工计算时,我得到的 BitSequence 长度比我的程序输出的要长得多。这是我创建值的 HashMap 的代码,其中 bytes 是该节点的字节值:
public static HashMap<Byte, String> getPath(Node n)
{
HashMap<Byte, String> map = new HashMap<Byte, String>();
buildPath(n, "", map);
return map;
}
public static void buildPath(Node n, String s, HashMap<Byte, String> map) {
if(n != null)
{
if (n.left != null){
buildPath(n.left, s+"0", map);
}
if (n.right != null){
buildPath(n.right, s+"1", map);
}
if(n.left == null && n.right == null)
{
map.put(bytes, s);
return;
}
}
return;
}
然后我遍历文件中的原始字节数组,并使用生成的 HashMap 将霍夫曼路径附加到一个序列,我将用霍夫曼树本身压缩该序列,以便稍后对其进行解码。是我生成路径的方式有误,还是我的问题出在其他地方?
我看到你的方法是静态的,所以我假设可变字节也是。这不会将字节值放入您的 HashMap,而是您将继续将 null 放在那里。摆脱静态,然后它应该正确地将字节值放入映射中。您可以将其设为私有并创建一个像 getByte() 这样 returns 的方法,或者您可以简单地创建字节 public 并使用您正在使用的任何对象调用它。