Как возможно, чтобы сложность алгоритма Борувки была O (E * logV)? - PullRequest
3 голосов
/ 28 июля 2010
 1 Begin with a connected graph G containing edges of distinct weights, and an empty set of edges T
 2 While the vertices of G connected by T are disjoint:
 3   Begin with an empty set of edges E
 4   For each component:
 5     Begin with an empty set of edges S
 6     For each vertex in the component:
 7       Add the cheapest edge from the vertex in the component to another vertex in a disjoint component to S
 8     Add the cheapest edge in S to E
 9   Add the resulting set of edges E to T.
10 The resulting set of edges T is the minimum spanning tree of G.

Из Википедии.Я понимаю, что внешний цикл - это logV, так как вы присоединяетесь к множествам.Но затем следует внутренний цикл.

Если вы используете отношения эквивалентности для отслеживания наборов, это означает, что вы получаете только элемент, представляющий набор, поэтому вы не можете определить ребро с наименьшим весоммежду двумя наборами, потому что у вас нет всех элементов.Если вы измените структуру так, чтобы она содержала ссылки на дочерние элементы, вам все равно придется получить все дочерние элементы каждого набора.Это означает, что в худшем случае O (V / 2) = O (V) для каждого набора.

После этого вам все еще нужно найти наименьшее ребро, соединяющее два, что означает пересечение всех ребер, соединяющих два компонента.Поэтому вам нужно перебрать каждый узел и посмотреть, соединяется ли его ребро с элементом в другом компоненте, и если да, то если оно меньше минимального ребра, которое у вас есть в данный момент.итерация по узлам и внутреннему циклу для итерации по краям этих узлов - O (V E).Поскольку он находится внутри цикла O (logV), вы получаете O (logV V * E).

Теперь кажется, что вам просто нужно перебрать все ребра, но как бы вы выбралиминимальный край между двумя компонентами?Я могу сказать, соединяет ли данное ребро узлы в разных компонентах, но я не могу сказать, какой из них соединяет их, имеет минимальный вес.И если я получу тот, у которого минимальный вес, он может их не соединить.

1 Ответ

2 голосов
/ 28 июля 2010

Если разрешены хеш-таблицы, то я вижу, как это может быть алгоритм O (Elog N). Каждый компонент хранится в виде отдельного хэш-набора. Первоначально каждый набор содержит один узел. Шаг нахождения минимальных «мостов» для всех компонентов занимает время O (E), поскольку мы проверяем каждое ребро не более двух раз и предполагаем постоянный поиск по времени в наборах хэшей. Затем мы продолжаем объединять множества, что занимает O (N) времени. Поскольку граф связан, E> = N-1, поэтому мы имеем общую стоимость O (E) за итерацию.

- EDIT -

Следуя комментариям throwawayacct, хеш-структуры вообще не нужны. На каждой итерации у нас есть граф леса, полученный в результате предыдущей итерации, поэтому мы можем пересчитать связанные с ним компоненты за время O (E). Это может быть сделано, например, путем простого обхода DFS со всех узлов, который устанавливает уникальный «цвет» для каждого компонента. Затем при сканировании ребер с целью поиска мостов мы рассматриваем только ребра, соединяющие узлы разного цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...