2015-11-18 2 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; 
    } 
Смежные вопросы