2015-11-18 35 views
1

讓我們假設我們正在使用沒有動態內存的開發環境(只有固定邊界的靜態數組)。如何實現List(或ArrayList)。 那麼,我想創建一個更大的新陣列,當我試圖添加元素到一個完整的數組,但我希望有更有效的方法。 P.S我沒有要求執行,我想要的想法:)LinkedList沒有動態內存分配

+3

一個常見的技巧是重新創建列表,如果它已滿。不是隻有一個元素,但很多,預計的規模增長。以這種方式,如果達到上限,你將只有很小的性能影響。 ...哦等等...這就是你建議的:-) – Stefan

+1

另一種方法是爲所有可能的類型創建一個容器,併爲該容器(或一對)創建最大可能的列表。然後,您將能夠從該大數組中創建子列表,並且該類型在該容器中定義。有點像舊的'VARIANT'(https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627%28v=vs.85%29.aspx)容器。它會給你速度超過記憶,但通常這是不值得的。 – Stefan

回答

2

您可以檢查Sedgewick的關於動態數組的文檔並調整它們的大小。你可以看到在Dynamic Array - Wikipedia和總體思路更詳細的定義this paper which is written by Sedgewick 還存在ResizingArrayQueue by Sedgewick

樣本雖然示例中使用你可以使用這種機制也爲linkedlists隊列。 在這個示例中,當它達到極限時,他將其大小加倍。

public void enqueue(Item item) { 
     // double size of array if necessary and recopy to front of array 
     if (N == q.length) resize(2*q.length); // double size of array if necessary 
     q[last++] = item;      // add item 
     if (last == q.length) last = 0;   // wrap-around 
     N++; 
    } 

而當極限減少到數組的四分之一時,他將數組減半。

public Item dequeue() { 
     if (isEmpty()) throw new NoSuchElementException("Queue underflow"); 
     Item item = q[first]; 
     q[first] = null;       // to avoid loitering 
     N--; 
     first++; 
     if (first == q.length) first = 0;   // wrap-around 
     // shrink size of array if necessary 
     if (N > 0 && N == q.length/4) resize(q.length/2); 
     return item; 
    }