У меня есть свой ответ, но я все равно добавлю его, так как многие люди не поняли правильно: я ищу точку вставки И вставка, которая в совокупности выше O(n)
.
Вы требуете поддерживать коллекцию (возможно) неуникальных элементов, которые могут повторяться в порядке, заданном функцией упорядочения. Это может быть достигнуто различными способами. (Далее я использую «общую стоимость вставки» для обозначения стоимости вставки ряда (N
) элементов в изначально пустую структуру данных.)
Один или два связанных списка предлагают O(N^2)
общую стоимость вставки (независимо от того, комбинируете ли вы шаги для нахождения позиции и выполнения вставки!) И O(N)
стоимость итерации.
TreeSet предлагает O(NlogN)
общую стоимость вставки и O(N)
стоимость итерации. Но не имеет дубликатов.
Мультисет множества на основе дерева (например, TreeMultiset
) имеет ту же сложность, что и TreeSet, но допускает дублирование.
Структура данных списка пропусков также имеет ту же сложность, что и предыдущие два.
Очевидно, что меры сложности говорят о том, что структура данных, которая использует связанный список , выполняет худшее , когда N становится большим. Для этой конкретной группы требований хорошо реализованный мультисет множества на основе дерева, вероятно, является лучшим, при условии, что есть только один поток, обращающийся к коллекции. Если коллекция интенсивно используется многими потоками (и это набор), то ConcurrentSkipListSet
, вероятно, лучше.
Похоже, у вас также есть неправильное представление о том, как сочетаются меры "большого О". Если у меня есть один шаг алгоритма, равный O(N)
, и второй шаг, который также равен O(N)
, то объединенные два шага - STILL O(N)
.... не "больше, чем O(N)
". Вы можете вывести это из определения «большой О». (Я не буду утомлять вас деталями, но математика проста.)