Почему z не пузырится в куче мин?

1

Я работаю над проблемой структуры данных практики из практики кучи

Цель состоит в том, чтобы создать конструктор для кучи 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

  • 0
    Что такое bubbleDown и hasLeftChild ?
  • 0
    вспомогательные методы. bubbleDown переместит узел вниз в правильную позицию, и hasLeftChild проверяет, есть ли у этого узла левый потомок.
Показать ещё 3 комментария
Теги:
algorithm
tree
heap
binary-tree

1 ответ

0
Лучший ответ

Проблема заключалась в том, что я слишком рано меняю размер.
Вот авторская реализация 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);
            }
        }          
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню