Я работаю над проблемой структуры данных практики из практики кучи
Цель состоит в том, чтобы создать конструктор для кучи min с заданным массивом. Автор уже дает нам алгоритм высокого уровня для этого: "Если вы просто" сбрасываете "все нелистовые узлы кучи, начиная с последнего нелистового узла и заканчивая корнем, когда вы закончите массив будет перестроен в правильный порядок кучи "
Вот как я закодировал этот алгоритм
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);
}
}
}
Кто-нибудь видит какие-либо проблемы с кодом? Я убедился, что вы начинаете с "нелистового узла и заканчиваетесь в корне", начиная с конца массива и идя до индекса 1, который представляет корень кучи. Я даже удостоверился, что узел является не листовым узлом перед вызовом предоставленного метода пузырьков.
При вводе [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 будет оцениваться как истинный, а "z" - пузырь. Однако то, как я это делаю, пузырь никогда не будет вызван.
Вот как я исправил свой код и прошел все тесты.
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);
}
}
}
}
bubbleDown
иhasLeftChild
?