2012-06-02 20 views
3

我想知道爲什麼PriorityQueue in Java的默認大小是11。我擡頭看看implementation,這讓我感到更加困惑。java中優先級隊列的默認大小

優先級隊列實現爲堆。其容量使用此功能進行調整:

/** 
* Increases the capacity of the array. 
* 
* @param minCapacity the desired minimum capacity 
*/ 
private void grow(int minCapacity) { 
    if (minCapacity < 0) // overflow 
     throw new OutOfMemoryError(); 
    int oldCapacity = queue.length; 
    // Double size if small; else grow by 50% 
    int newCapacity = ((oldCapacity < 64)? 
         ((oldCapacity + 1) * 2): 
         ((oldCapacity/2) * 3)); 
    if (newCapacity < 0) // overflow 
     newCapacity = Integer.MAX_VALUE; 
    if (newCapacity < minCapacity) 
     newCapacity = minCapacity; 
    queue = Arrays.copyOf(queue, newCapacity); 
} 

我不明白容量的初始值11。我認爲容量應該始終爲2到級別的數量。任何澄清?

+0

11可能是優先級隊列比順序數據結構有優勢的最小大小。 – EJP

回答

3

11可能是一個或多或少隨意選擇的數字,因爲內存消耗(數量太大會消耗過多的內存,無用)和CPU消耗(數量太少會需要太多調整隊列大小)。他們可能會以典型用例爲基準來選擇這個數字和用於調整隊列大小的策略。

+0

如果堆的大小是11,那麼我們需要4次隨後的插入/刪除操作來更改堆中的層數。因此,在[8,15]之間,11是這方面的最佳選擇。儘管如此,這種思路對其他價值觀並不成比例。 –