Я собираюсь предположить, что сложность, которую вы запрашиваете, - это время, чтобы проверить, принадлежат ли 2 узла одному и тому же набору.
Ключ в том, как соединяются множества, в частности, вы берете кореньодного набора (меньшего), и пусть он указывает на корень другого набора.Пусть два набора имеют p
и q
в качестве корней соответственно, а |p|
будет представлять размер набора p
, если p
является корнем, тогда как в целом это будет количество элементов, которые установленыпуть идет через p (который равен 1 + всем его дочерним элементам).
Мы можем без ограничения общности предположить, что |p| <= |q|
(в противном случае мы просто поменяемся их именами).Тогда у нас есть это |p u q| = |p|+|q| >= 2|p|
.Это показывает нам, что каждое поддерево в структуре данных может быть не более чем наполовину больше, чем его родительский элемент, поэтому, учитывая N
элементов, оно может иметь максимальную глубину 1+lg N = O(lg(N))
.
Если два выбранных элементаНаименьшее возможное расстояние от корня потребуется O(N)
операций, чтобы найти корень для каждого из их наборов, поскольку вам нужно всего лишь O(1)
операций для перемещения вверх на один уровень в наборе, а затем O(1)
операций для сравнения этихкорни.
Эта стоимость также применяется к каждой операции объединения, так как вам нужно выяснить, какие два корня нужно объединить.Причина, по которой мы не просто указываем на все узлы, указывающие непосредственно на корень, в несколько раз.Во-первых, нам нужно было бы менять все узлы в наборе каждый раз, когда мы выполняем объединение, во-вторых, у нас есть только ребра, направленные от узлов к корню, а не наоборот, поэтому нам нужно было бы просмотреть все узлы, чтобы найти их.мы должны были бы измениться.Следующая причина заключается в том, что у нас есть хорошие оптимизации, которые могут помочь в этом шаге и все еще работать.Наконец, вы можете сделать такой шаг в конце, если вам действительно это нужно, но это будет стоить O(N lg(N))
времени для его выполнения, что сопоставимо с тем, сколько времени потребуется для запуска всего алгоритма без использования быстрого ярлыка.оптимизация.