Java中的自下而上的堆

时间:2011-02-12 15:28:30

标签: java algorithm recursion arraylist heap

所以,我试着在这里实现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)

现在我假设H1和H2是堆或节点?这是我对java应该做些什么感到困惑的地方。

然后对于下一部分,看起来我应该k.left = H1k.right = H2

我不确定它什么时候说“k at root”。 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;
}

谢谢!

1 个答案:

答案 0 :(得分:0)

  

现在我假设H1和H2是堆或节点?

你的讲义的第一页说明了这一点:

  

“堆是一个二叉树H,它在其内部节点上存储了一组键......”

     

这是我对java应该做些什么感到困惑的地方。

有多种方法可以做到这一点,但明显的表示是一个具有值的Tree类,以及左右子树的引用。

  

我不确定它什么时候在根本上说k。 k不是根节点吗?

它是当前对bottomUpHeap的调用创建的堆的根。请注意,该算法是递归的!

  

如果是这样的情况,我会从k做一个下堆泡沫吗?那么在最后,H在这一点上也是k?

这就是它所说的。

  

我没有发布我的代码,但我得到的错误是在递归调用的子列表中。

除非您发布代码和错误,否则我们无能为力。