我看到了将项添加到二进制堆的奇怪行为。我添加了三个值:20,31,12
。当我检查数组中的项目时,现在有5个值:12,20,20,31,12
。我无法弄清楚重复的来源。为什么要重复项目?
添加项目:
public void add(int x){
int hole = heap.size();
heap.add(hole, x);
bubbleUp(hole);
}
bubbleup
方法:
private void bubbleUp(int child) {
int parent;
Bid tmp;
if (child != 0) {
parent = (child-1)/2;
if (heap.get(parent).compareTo(heap.get(child))) {
tmp = heap.get(parent);
heap.add(parent, heap.get(child));
heap.add(child, tmp);
bubbleUp(parent);
}
}
}
答案 0 :(得分:3)
就在这里
heap.add(parent, heap.get(child));
heap.add(child, tmp);
您想要做的是交换元素。 two argument version of add
仍会添加一个元素,而不是替换该位置的先前值。
改为使用set
。
答案 1 :(得分:2)
add(int,Object)
很可能是插入。试试set(int,Object)
。