Давайте предположим, что мы используем среду разработки без динамической памяти (существуют только статические массивы с фиксированными границами). Как можно реализовать List (или ArrayList). Ну, у меня есть идея просто создать новый массив большего размера, когда я пытаюсь добавить элемент в полный массив, но я надеюсь, что есть более эффективный способ. P.S Я не прошу об осуществлении, я прошу идеи :)LinkedList без динамического распределения памяти
1
A
ответ
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;
}
Смежные вопросы
- 1. Идиома Pimpl без использования динамического распределения памяти
- 2. Реализация стека без динамического распределения памяти
- 3. Возвратите полиморфный тип без динамического распределения памяти?
- 4. динамического распределения памяти
- 5. Использование динамического распределения памяти
- 6. Распределение динамического распределения памяти
- 7. Ошибка динамического распределения памяти
- 8. Вопрос относительно динамического распределения памяти
- 9. Динамического распределения памяти с перераспределить
- 10. Сохранение структур без динамического распределения
- 11. Реализация RSA без динамического распределения
- 12. Инициализация значений для памяти после динамического распределения?
- 13. Как создать массив объектов без динамического распределения памяти
- 14. C++, добавление временных объектов в список, без динамического распределения памяти
- 15. Как управлять fortran 77 без динамического распределения памяти?
- 16. Динамического распределения памяти в «с» Проблемы
- 17. Как избежать динамического распределения памяти C++
- 18. тяга динамического распределения памяти для массива
- 19. Использование динамического распределения памяти с библиотеками C++
- 20. Вопросы динамического распределения памяти в C
- 21. отслеживание динамического распределения памяти в c/C++
- 22. C++ динамического распределения памяти с mxArray
- 23. Моделирование динамического распределения памяти в OpenCl
- 24. понимания использования динамического распределения памяти в C++
- 25. распределения памяти
- 26. Сжатие данных без потерь в C без распределения динамической памяти
- 27. Матрица: вопрос распределения памяти
- 28. динамического распределения памяти и многоуровневые массивы в C
- 29. динамического распределения C++ объекта без использования нового оператора
- 30. Ошибка динамического распределения? C++
Общей трюкой является воссоздание списка, если оно заполнено. Не только с одним элементом, но и с большим количеством ожиданий роста размера. Таким образом, вы получите небольшое влияние на производительность, если достигнут верхний уровень. ... о, подождите ... вот что вы предложили :-) – Stefan
Альтернативой является создание одного контейнера для всего возможного типа и создание максимально возможного списка для этого контейнера (или пары). Затем вы сможете создавать под-списки из этого большого массива, и тип определяется в этом контейнере. Немного напоминает старый контейнер VARIANT (https://msdn.microsoft.com/en-us/library/windows/desktop/ms221627%28v=vs.85%29.aspx). Это даст вам скорость по памяти, но обычно это не стоит. – Stefan