所以,我试着在这里实现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)
到目前为止我所拥有的:
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()之类的空做任何事情时,它会抛出一个错误。
谢谢!
答案 0 :(得分:0)
我以前经历过这个,结论是你必须使用:
S1 = new ArrayList(S.sublist(0, S.length/2));
javadoc有点不清楚,但sublist
只返回给定范围的原始列表视图。看看source code看看神奇的发生。
如果你仍然希望保留这一点,在我看来完全尴尬,抽象我会建议你使用s.size() == 0
而不是s.isEmpty()
。哦,约定也有变量在camelcase中声明。
答案 1 :(得分:0)
在迭代列表时,您不能remove
。
这样做:
private Tree heapify(List list){ if (list.isEmpty()){ return null; } int tmpk = list.get(0); // list.remove(0); List s1 = null; List s2 = null; list = list.subList(1, list.size()); // change the list instead int halfArr = list.size()/2; s1 = list.subList(0, halfArr); s2 = list.subList(halfArr, list.size()); Tree k = new Tree(tmpk, heapify(s1), heapify(s2)); return k; }