Вычислительная сложность операций 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)