Вычислительная сложность операций TreeSet в Java?

Я пытаюсь прояснить некоторые вещи, касающиеся сложности в некоторых операциях TreeSet. На javadoc он говорит:

"эта реализация обеспечивает гарантированная цена времени журнала (n) для основные операции (добавление, удаление и содержит.)"

пока все хорошо. Мой вопрос в том, что происходит на addAll (), removeAll() и т. д. Здесь javadoc для набора говорит:

" если указанная коллекция также является набор, addAll работа эффективно изменяет этот набор так, чтобы его значение объединение двух наборов."

Это просто объясняет логический результат операции или дает намек на сложность? Я имею в виду, если два набора представлены, например, красно-черными деревьями, было бы лучше каким-то образом присоединиться к деревьям, чем "добавить" каждый элемент одного к другому.

в любом случае, есть ли способ, чтобы объединить два TreeSets в один с O(Фремонт, Калифорния) сложность?

заранее спасибо. :-)

4 ответов


вы можете себе представить, как можно было бы оптимизировать специальные случаи до O(log n), но худший случай должен быть O(m log n) здесь m и n - количество элементов в каждом дереве.

Edit:

http://net.pku.edu.cn/~course/cs101/resource/Intro2Algorithm/book6/chap14.htm

описывает алгоритм специального случая, который может объединять деревья в O(log(m + n)) но обратите внимание на ограничение: все члены S1 должно быть меньше всех члены S2. Это то, что я имел в виду, что существуют специальные оптимизации для особых случаев.


глядя на источник java для TreeSet, похоже, что если переданная коллекция является SortedSet, то она использует алгоритм времени O(n). В противном случае он вызывает super.addAll, который, я предполагаю, приведет к O (N logn).

EDIT-думаю, я читаю код слишком быстро, TreeSet может использовать только алгоритм O(n), если он поддерживает пустую карту


согласно этому сообщению в блоге:
http://rgrig.blogspot.com/2008/06/java-api-complexity-guarantees.html
Это O (N log n). Поскольку документация не дает никаких намеков на сложность, вы можете написать свой собственный алгоритм, если производительность критична для вас.


невозможно выполнить слияние деревьев или присоединить наборы, как в структурах данных непересекающихся наборов, потому что вы не знаете, являются ли элементы в 2 деревьях непересекающимися. Поскольку структуры данных имеют знания о содержимом в других деревьях, необходимо проверить, существует ли один элемент в другом дереве, прежде чем добавлять к нему или, по крайней мере, пытаться добавить его в другое дерево и прервать добавление, если вы найдете его по пути. Итак, это должно быть O (MlogN)