I';我在《哈夫曼》中发现了一些逻辑错误;s编码java
这是代码I';我在《哈夫曼》中发现了一些逻辑错误;s编码java,java,huffman-code,Java,Huffman Code,这是代码 public class Huffman_Coding { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Enter a string to compress: "); String str = sc.nextLine(); sc.close();
public class Huffman_Coding {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string to compress: ");
String str = sc.nextLine();
sc.close();
HashString hs = new HashString();
HashMap<Character, Integer> hm = hs.getStringHash(str);
PriorityQueue<Node> pq = new PriorityQueue<Node>();
for (char ch : hm.keySet()) {
pq.add(new Node(null, null, hm.get(ch), ch));
}
System.out.println(pq);
while (pq.size() != 1) {
Node left = pq.poll();
Node right = pq.poll();
Node parent = new Node(left, right, left.freq + right.freq, '\0');
pq.add(parent);
System.out.println(pq);
}
Huffman_Tree ht = new Huffman_Tree();
String ans = "";
ht.inOrder(pq.poll(), ans);
}
}
class Node implements Comparable<Node> {
@Override
public String toString() {
return "Node [freq=" + freq + ", ch=" + ch + "]";
}
Node lptr;
Node rptr;
int freq;
char ch;
Node(Node lptr, Node rptr, int freq, char ch) {
this.freq = freq;
this.lptr = lptr;
this.rptr = rptr;
this.ch = ch;
}
public int compareTo(Node o) {
int comparedvalue = Integer.compare(this.freq, o.freq);
if (comparedvalue != 0)
return comparedvalue;
else
return Integer.compare(this.ch, o.ch);
}
}
boolean isLeaf() {
return this.lptr == null && this.rptr == null;
}
}
class Huffman_Tree {
void inOrder(Node root, String code) {
if (!root.isLeaf()) {
inOrder(root.lptr, code + '0');
inOrder(root.rptr, code + '1');
} else
System.out.println(root.ch + " : " + code);
}
}
我不明白为什么在第二步中,节点的“d”是从“e”开始的。这使我在最终编码中出错。我不明白为什么比较法会失败
getHashString返回一个散列,其中键中有字符,值中有字符。我不明白为什么轮询元素和添加新的“合成”元素后,
PriorityQueue
中的元素顺序不是预期的顺序,但我想您可以解决切换到树集的问题,正如我在成功方面所做的那样
TreeSet<Node> pq = new TreeSet<Node>((n1, n2) -> n1.compareTo(n2)); // explicit but unnecessary comparator
TreeSet pq=新树集((n1,n2)->n1.比较(n2));//显式但不必要的比较器
并将每个pq.poll()
调用更改为pq.pollFirst()
我希望这个解决方法能帮助你
编辑
正如您在中所读到的,*方法Iterator()中提供的迭代器不能保证以任何特定顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用数组。排序(pq.toAlayle())。*
这应该解释为什么toString()
方法调用以不同于预期优先级的顺序显示队列元素…为了重现您的问题,您可以提供HashString
类的代码吗?
TreeSet<Node> pq = new TreeSet<Node>((n1, n2) -> n1.compareTo(n2)); // explicit but unnecessary comparator