为什么 z 没有在最小堆中冒泡?
Why isn't the z bubbling down in the min heap?
我正在练习 Heap Practice
中的一个数据结构练习题
objective是用给定的数组构造一个最小堆的构造函数。作者已经为我们提供了这样做的高级算法,"If you just "向下冒泡“堆的所有非叶节点,从最后一个非叶节点开始到根结束,当你完成时该数组将重新排列为正确的堆顺序
下面是我编写该算法的方法
public HeapPriorityQueue(E[] theElements) {
elements = theElements;
size = 0;
int len = theElements.length;
for(int c= len - 1;c>=1; c --) {
if(elements[c] != null) {
size ++;
if(hasLeftChild(c))
bubbleDown(c);
}
}
}
有人看到代码有问题吗?我确保从 "non-leaf node and end at the root" 开始,从数组的末尾开始,一直到代表堆根的索引 1。我什至确保在调用提供的 bubble down 方法之前检查该节点是否为非叶节点。
当输入
[null, b, f, a, z, x, k, q, j]
我的代码生成 [a, f, b, z, x, k, q, j]
的输出,与 [a, f, b, j, x, k, q, z]
的预期输出不匹配。我明白为什么它没有(z 没有冒泡)。
有谁知道如何修复这个程序以便它可以匹配预期的输出?奇怪的是 'z' 没有冒泡,但 'b' 在我的代码中冒泡了。
这里是作者对最小堆的实现,你要将这个构造函数添加到Stepp Min Heap
问题是我过早地重置了大小。
这里是作者对 hasLeftChild()
的实现
private boolean hasLeftChild(int index) {
return leftChild(index) <= size;
}
private int leftChild(int index) {
return index * 2;
}
通过将大小设置为零,并在我从末尾进行的每一次传递中递增它,当达到 'z' 或索引 4 时,大小字段将仅为 5,而不是它应该的值是 8。如果它是 8,则对 hasLeftChild 的调用将评估为 true,并且 'z' 将向下冒泡。不管我怎么处理,永远不会调用 bubble down。
这就是我修复代码并通过所有测试的方式。
public HeapPriorityQueue(E[] theElements) {
elements = theElements;
size = theElements.length - 1;
int len = theElements.length;
for(int c= len - 1;c>=1; c --) {
if(elements[c] != null) {
if(hasLeftChild(c)){
bubbleDown(c);
}
}
}
}
我正在练习 Heap Practice
中的一个数据结构练习题objective是用给定的数组构造一个最小堆的构造函数。作者已经为我们提供了这样做的高级算法,"If you just "向下冒泡“堆的所有非叶节点,从最后一个非叶节点开始到根结束,当你完成时该数组将重新排列为正确的堆顺序
下面是我编写该算法的方法
public HeapPriorityQueue(E[] theElements) {
elements = theElements;
size = 0;
int len = theElements.length;
for(int c= len - 1;c>=1; c --) {
if(elements[c] != null) {
size ++;
if(hasLeftChild(c))
bubbleDown(c);
}
}
}
有人看到代码有问题吗?我确保从 "non-leaf node and end at the root" 开始,从数组的末尾开始,一直到代表堆根的索引 1。我什至确保在调用提供的 bubble down 方法之前检查该节点是否为非叶节点。
当输入 [null, b, f, a, z, x, k, q, j]
我的代码生成 [a, f, b, z, x, k, q, j]
的输出,与 [a, f, b, j, x, k, q, z]
的预期输出不匹配。我明白为什么它没有(z 没有冒泡)。
有谁知道如何修复这个程序以便它可以匹配预期的输出?奇怪的是 'z' 没有冒泡,但 'b' 在我的代码中冒泡了。
这里是作者对最小堆的实现,你要将这个构造函数添加到Stepp Min Heap
问题是我过早地重置了大小。
这里是作者对 hasLeftChild()
private boolean hasLeftChild(int index) {
return leftChild(index) <= size;
}
private int leftChild(int index) {
return index * 2;
}
通过将大小设置为零,并在我从末尾进行的每一次传递中递增它,当达到 'z' 或索引 4 时,大小字段将仅为 5,而不是它应该的值是 8。如果它是 8,则对 hasLeftChild 的调用将评估为 true,并且 'z' 将向下冒泡。不管我怎么处理,永远不会调用 bubble down。
这就是我修复代码并通过所有测试的方式。
public HeapPriorityQueue(E[] theElements) {
elements = theElements;
size = theElements.length - 1;
int len = theElements.length;
for(int c= len - 1;c>=1; c --) {
if(elements[c] != null) {
if(hasLeftChild(c)){
bubbleDown(c);
}
}
}
}