Когда вы проверите это question, вы обнаружите, что add
и contains
уже есть O (1). Таким образом, там не так много улучшений.
И я думаю, что что те два будет только один раз может извлечь выгоду из этого ограничения:
- «добавление» становится легче, потому что вы могли бы просто вспомнить последнее значение, которое было добавлено; поэтому нужна только одна проверка, когда новое значение приходит в
- Аналогично, при запросе «содержится»; у вас есть первый предварительный чек, который говорит вам мгновенно, когда заданное значение может не быть в наборе
Но это о нем.
И кроме того: когда ваше ограничения действительно, что каждая «новая» запись, которая собирается добавить больше, чем предыдущий - то вам не нужно Set в первую очередь. Потому что ограничение гарантирует, что все элементы будут уникальными. Итак, в этом смысле вы также можете искать в списках ...
Относительно комментария, который задает вопрос между возможными дельтами между O (1) и O (1.5); мой ответ:
Разница между O (1) и O (n) имеет теоретический характер, вы отвечаете на это, используя ручку и лист бумаги. Разница между O (1.0) и O (1.005) ... там я бы начал с экспериментов и контрольных показателей.
Смысл: эти «реальные» факторы зависят от различных элементов, которые «близки» к базовой реализации. Вы начнете с изучения того, как набор, который вы используете в настоящее время, используется для вашей платформы; и как JVM на ваша платформа делает свою компиляцию точно вовремя. Оттуда вы могли бы сделать выводы о вещах, которые можно было бы улучшить, учитывая это ограничение.
И наконец; относительно ограничения унизительных существующих реализаций. Думаю, это тоже может случиться; как указано выше: такие детали действительно зависят от конкретной реализации. И помимо этого: вы назвали три разных операции; и фактические результаты могут быть очень разными; в зависимости от типа операции.
Если бы мне пришлось поработать над этой проблемой; Я бы начал с создания достаточно больших файлов с «тестовыми данными» (случайные числа, числа только для увеличения и варианты этого). И тогда я бы использовал профилировщик real (или, по крайней мере, утонченный benchmarking) и начал измерять.
Просить о такой деликатной форме возможного повышения производительности, а затем случайно бросать в * (примитивный или нет) * «кажется противоречивым. Если производительность * действительно * критическая, тогда вы должны использовать только тип * примитив *. Существует несколько примитивных библиотек. – Marco13
, если вы добавите целое число, сложность будет такой же, как и 0, будет сохранена в двух байтах, а Integer.MAX также будет содержать два байта. – nafas
@ Marco13 Конечно, примитивные наборы будут вести себя лучше, и я предпочел бы их над другими реализациями, но вопрос скорее теоретический. – Osw