Итак, я пытаюсь реализовать алгоритм 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, и я продолжаю получать некоторые ошибки, неизвестные мне.Мне было интересно, поможет ли кто-нибудь мне разобраться с некоторыми шагами алгоритма.
Я создал узел Heap с данными и указателями на левую и правую ссылки (или как их называет java).Входная последовательность представляет собой массив, который преобразуется в ArrayList
.Вот что я передаю в функцию выше.
Я удаляю первый ключ из S и создаю новый узел с этим ключом.В моем примере я просто использую Integer
s, а ключ установлен на ссылку на данные.
Затем я использую S1 = S.sublist(0, S.length/2)
и S2 = S.sublist(S.length/2, S.length)
Вот что у меня такfar:
Передается 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;
}
Из того, что кажется, что, когда пустой список пропущен, он не считает его пустым списком при использовании подсписка по какой-то причине.Похоже, что когда он пытается что-то сделать на пустом месте, например S.isEmpty (), он выдает ошибку.
Спасибо!