Ответ 1
смотрите установки на основе набора (Hashset, enumset) и хэша (HashMap, linkedhash..., idnetityhash..). они имеют O (1) для содержит()
Этот чит-лист очень помогает.
Какая структура данных в Java, которая имеет самую быструю операцию для contains()?
например. У меня есть набор чисел {1, 7, 12, 14, 20...}
Учитывая другое произвольное число x, какой самый быстрый способ (в среднем) генерировать логическое значение того, содержится ли x в наборе или нет? Вероятность для! Содержит() примерно в 5 раз выше.
Предоставляют ли все структуры карты операцию o (1)? Является ли HashSet самым быстрым способом?
смотрите установки на основе набора (Hashset, enumset) и хэша (HashMap, linkedhash..., idnetityhash..). они имеют O (1) для содержит()
Этот чит-лист очень помогает.
Для вашего конкретного случая чисел с относительно высокой плотностью я бы использовал BitSet, он будет быстрее и намного меньше, чем хэш-набор.
Единственная структура данных быстрее, чем HashSet, скорее всего, будет TIntHashSet из Trove4J. Это использует примитивы, избегая необходимости использовать Integer Objects.
Если число целых чисел невелико, вы можете создать boolean [], где каждое имеющееся значение превращается в "true". Это будет O (1). Примечание: HashSet не является защищенным от O (1) и, скорее всего, будет O (log (log (N))).
Вы получите только O (1) для идеального хэш-распределения. Однако, скорее всего, вы столкнетесь с столкновениями хэшированных ведер, и некоторые поиски должны будут проверить более одного значения.
хеширование (хэш-набор) является лучшим с O (1)