关于BinaryHeap,如何确定数组的初始大小?

时间:2013-03-22 13:12:34

标签: java heap

public BinaryHeap( AnyType [ ] items ) {
    currentSize = items.length;
    array = (AnyType[]) new Comparable[ ( currentSize + 2 ) * 11 / 10 ];

    int i = 1;
    for( AnyType item : items )
        array[ i++ ] = item;
    buildHeap( );
}

为什么array.length = (currentSize + 2) * 11 /10

1 个答案:

答案 0 :(得分:0)

我会这样解读:

  • currentSize + 2 - 确保将两个元素添加到堆中,将容量增加两个
  • (currentSize + 2) * 11/10 - 将容量提高10%
事实是,这样的堆实现具有有限的容量 - 受分配的数组的长度限制。插入((currentSize + 2) * 11/10 + 1)元素时,您需要调整数组的大小,这可能是一项代价高昂的操作。特别是如果你总是通过将旧的数组长度增加一个来调整大小。

看起来代码的作者想要确保数组的大小足以容纳可能添加到其中的所有元素。

编辑:

正如Ivaylo Strandjev在评论中提到的,设置堆大小的常用方法是选择k 2^k > currentSize。如果输入项大小足够大,代码的作者可能不会选择该方法:

e.g。在大多数情况下,预期输入大小为~1200,峰值为1500,并且您的初始输入大小为1025个元素。按照通常的方法,你必须选择k = 11 - >大小是2048,但这意味着你在内存中浪费(2048 - 1500 = 548)*大小的AnyType对象字节。