На самом деле это не большой вопрос. Какая коллекция подходит для быстрого добавления, получения и удаления случайного элемента?

Товары не должны сохранять какой-либо порядок.

Я разрабатываю игру со змейкой и отслеживаю незанятые клетки в игровой зоне (чтобы иметь возможность быстро выбрать новое место для яблока, когда оно будет съедено).

Здесь «быстро» может быть O (log n) или O (1).

1
Olavi Mustanoja 7 Мар 2015 в 22:32

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) для поиска случайного элемента.

4
aioobe 7 Мар 2015 в 19:51

HashMap, он имеет сложность O (1) для всех трех (в большинстве случаев): http://en.wikipedia.org/wiki/Hash_table

-1
user4645046 7 Мар 2015 в 19:42

Лучшее List - это LinkedList Удаление и вставка происходит в O (1), но получение позиции происходит в O (n). Получить элемент в позиции n - O (n).

В противном случае вы можете использовать TreeSet. Все операции выполняются за O (log n).

Если вы можете использовать ключ для извлечения вашего элемента, вы можете использовать Map. HashMap имеет вставку, извлечение, удаление в O (1)

0
Davide Lorenzo MARINO 7 Мар 2015 в 19:39