На самом деле это не большой вопрос. Какая коллекция подходит для быстрого добавления, получения и удаления случайного элемента?
Товары не должны сохранять какой-либо порядок.
Я разрабатываю игру со змейкой и отслеживаю незанятые клетки в игровой зоне (чтобы иметь возможность быстро выбрать новое место для яблока, когда оно будет съедено).
Здесь «быстро» может быть O (log n) или O (1).
3 ответа
Я бы рекомендовал сбалансированное двоичное дерево. Вставка / удаление будет O (log (n)), а выбор случайного элемента будет вопросом случайного перехода по ветвям к листу, O (log (n)).
Если поиск незанятого места для яблока - относительно необычная операция по сравнению с добавлением / удалением занятых ячеек, я бы выбрал LinkedHashSet
:
- Сделать ячейку незанятой:
unoccupied.add(pos)
, O (1) (амортизировано) - Сделать ячейку занятой:
unoccupied.remove(pos)
, O (1) Найдите случайную незанятую ячейку:
if (unoccupied.isEmpty()) throw something; int i = random.nextInt(unoccupied.size()); Iterator<Pos> iter = unoccupied.iterator(); while (i-- > 0) iter.next(); return iter.next();
(Использование LinkedHashMap
вместо HashMap
гарантирует O (n) для последней операции.)
ArrayList
будет иметь O (n) для удаления. У LinkedList
или HashSet
будет O (n) для поиска случайного элемента.
HashMap, он имеет сложность O (1) для всех трех (в большинстве случаев): http://en.wikipedia.org/wiki/Hash_table
Лучшее List
- это LinkedList
Удаление и вставка происходит в O (1), но получение позиции происходит в O (n). Получить элемент в позиции n - O (n).
В противном случае вы можете использовать TreeSet
. Все операции выполняются за O (log n).
Если вы можете использовать ключ для извлечения вашего элемента, вы можете использовать Map
. HashMap
имеет вставку, извлечение, удаление в O (1)
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.