2010-08-02 2 views
7

Я пытаюсь прояснить некоторые вещи, связанные с сложностью некоторых операций TreeSet. На Javadoc он говорит:Вычислительная сложность операций TreeSet в Java?

«Эта реализация обеспечивает гарантированно журнала (п) затраты времени для основных операций (добавить, удалить и содержит).»

Пока все хорошо. Мой вопрос: что происходит на addAll(), RemoveAll() и т.д. Здесь Javadoc для Set говорит:

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

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

В любом случае, есть ли способ объединить два набора TreeSets в один с сложностью O (logn)?

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

+0

Ответ на полученные ответы: Я не могу это понять. Предположим, у вас есть два SortedSets, которые не имеют перекрывающихся элементов и представлены красно-черными деревьями. Почему вы не можете присоединиться к ним, так как операция «join» в красно-черных деревьях берет O (log (n + m)) время? –

ответ

6

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

Edit:

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

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

1

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

3

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

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

0

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

+0

Я не могу это понять. Предположим, у вас есть два SortedSets, которые не имеют перекрывающихся элементов и представлены красно-черными деревьями. Почему вы не можете присоединиться к ним, так как операция «join» в красно-черных деревьях берет O (log (n + m)) время? –

+0

Учитывая 2 произвольных TreeSets, как вы узнаете, так ли это? – user855

+0

Ну в соответствии с программой, которую я сейчас делаю, я могу гарантировать, что у двух TreeSets не будет никакого перекрывающегося элемента. Однако кажется, что я не могу присоединиться к ним в O (log (n + m)), как указано в остальных ответах ... –

Смежные вопросы