так что только что узнал об алгоритме Крускала для минимальных остовных деревьев.Итак, вот мое понимание:
Инициализирует структуру данных с непересекающимся множеством, которая содержит все вершины V.
После сортировки ребер по весу в | E | log | E |время или | E |время с использованием счетной сортировки (если позволяют весовые коэффициенты), алгоритм Крукалса выполняет итерацию по отсортированным ребрам и добавляет ребро (u, v) к дереву минимального охвата, если узлы u и v не являются частью одного и того же набора в непересекающемся множествеСтруктура. Википедия говорит, что время поиска и поиска в этой структуре с непересекающимся множеством - это (V), где a - обратная функция Аккермана.
Я чувствую, что этот поиск может быть ускорен, но не уверен на 100% в сложности.Вот что я предлагаю:
Для каждой вершины графа присвойте ей значение от 0 до | V | -1, теперь эти числа являются их индексами.Инициализировать массив размером | V |со всеми значениями, установленными на 0.
При переборе наших ребер (u, v) мы можем искать их индексы за O (1) раз в массиве, если любое из этих значений массива равно 0, тогда мыустановите их в 1 и добавьте это ребро к нашему минимальному остовному дереву.
Такое ощущение, что мы делаем это таким образом, что мы можем рассчитывать время O (V), которое лучше, чем O (a (V)), для поиска и объединения множеств в алгоритме Крускаласа за счет | V |пространство, так как нам нужно хранить дополнительное значение для каждой вершины.
Это кажется правильным или я просто бредил временем доступа к массиву?