Итак, я пытаюсь реализовать алгоритм bottomupheap здесь:
http://www.apl.jhu.edu/Classes/Notes/Felikson/courses/605202/lectures/L8/L8.html
Algorithm bottomUpHeap(S)
Input: a sequence S storing 2h-1 keys
Output: a heap H storing the keys in S
if S is empty then
return an empty heap
remove the first key, k, from S
Split S into subsequences S1 and S2, each of size (n-1)/2
H1¬ bottomUpHeap(S1)
H2¬ bottomUpHeap(S2)
Create binary tree H such with k at root, H1 at left subtree and H2 at right subtree
Perform down-heap bubbling from root if necessary
return H
Прошло много времени с тех пор, как я запрограммировал в Java, и я продолжаю получать некоторые ошибки, неизвестные мне. Мне было интересно, поможет ли кто-нибудь мне разобраться с некоторыми шагами алгоритма.
Я создал узел кучи с данными и указателями ссылок слева и справа (или как их называет java). Входная последовательность представляет собой массив, который преобразуется в ArrayList
. Вот что я передаю в функцию выше.
Я удаляю первый ключ из S и создаю новый узел с этим ключом. В моем примере я просто использую Integer
s, а ключ установлен на ссылку на данные.
Я тогда использую
S1 = S.sublist(0, S.length/2)
а также
S2 = S.sublist(S.length/2, S.length)
Теперь я бы предположил, что H1 и H2 - это кучи или узлы? Здесь я немного запутался в том, что мне следует делать в Java.
Тогда для следующей части, похоже, я должен сделать k.left = H1
и k.right = H2
Я не совсем уверен, когда он говорит "k в корне". Разве k
не является корневым узлом? Если бы это было так, я бы тоже сделал пузырек с k
? Тогда в самом конце H
будет k
и в этот момент?
Извините, что у меня нет кода для публикации, но ошибки, которые я получаю, находятся в подсписке рекурсивного вызова.
Обновлен:
Значение ArrayList
передается как S. Tree
определяется как Tree(data, left, right)
. Спасибо.
private Tree Heapify(List<Integer> S){
if (S.isEmpty()){
Tree emptyHeap = new Tree();
return emptyHeap;
}
int tmpk = S.get(0);
S.remove(0);
int halfArr = S.size()/2;
List<Integer> S1 = S.subList(0, halfArr);
List<Integer> S2 = S.subList(halfArr, S.size());
Tree k = new Tree(tmpk, Heapify(S1), Heapify(S2));
//Downheap.
return null;
}
Спасибо!