Что лучше O (V + E) или O (ElogE)?

Я пытаюсь разработать алгоритм, который сможет найти минимальное остовное дерево из графа. Я знаю, что для него уже существует много существующих алгоритмов. Однако я пытаюсь исключить сортировку ребер, требуемую в алгоритме Крускала. Алгоритм у меня есть. Разработанная до сих пор часть, в которой необходим подсчет непересекающихся множеств, и мне нужен эффективный метод для этого. После долгих исследований я узнал, что единственный возможный способ - использовать BFS или DFS со сложностью O (V + E) тогда как алгоритмы Крускала имеют сложность O (ElogE). Теперь мой вопрос: какой из них лучше, O (V + E) или O (ElogE)?

Предполагая, что циклов нет, V можно выразить через E, используя формулу Эйлера. Следовательно, O(V+E) на самом деле просто O(E). Начиная с O(n) < O(nlogn), O(E + V) ~= O(E) < O(ElogE) . Я не уверен в своих расчетах, поэтому размещаю это как комментарий, а не как ответ

Srini 01.05.2018 18:55

@Srini Вы не можете предполагать, что цикла нет, поскольку вопрос заключается в вычислении минимального остовного дерева графа (так неориентированного и с потенциально нетривиальными циклами). Однако, предполагая, что существует дерево, которое нужно найти, мы можем с уверенностью предположить, что V <= E

Rerito 01.05.2018 19:02

@Rerito хороший момент, я проигнорировал аспект циклов, потому что я не был уверен, что делать с компонентом F в V - E + F = 2 для формулы Эйлера для плоских графов. Но я полагаю, что если ОП или кто-то другой сможет выяснить, как с этим справиться, или докажет, что V все еще имеет линейную связь с E, тогда, я думаю, они все равно могли бы опираться на этот аргумент

Srini 01.05.2018 19:05

Параллельное выполнение обоих алгоритмов и остановка, как только один из них завершится, дает вам сложность O(min(V+E, E Log E)), которая всегда является лучшей.

Yves Daoust 01.05.2018 22:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
887
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В общем, E = O(V^2), но эта граница не может быть жесткой для всех графов. В частности, в разреженном графе E = O(V), но для сложности алгоритма обычно указывается как значение наихудшего случая.

O(V + E) - это способ указать, что сложность зависит от количества ребер. В разреженном графе O(V + E) = O(V + V) = O(V), а в плотном - O(V + E) = O(V + V^2) = O(V^2).

Другой способ взглянуть на это - увидеть, что в нотации с большим О O(X + Y) означает то же, что и O(max(X, Y)).

Обратите внимание, что это полезно только тогда, когда V и E могут иметь одинаковую величину. Для алгоритма Краскала доминирующим фактором является то, что вам нужно отсортировать список ребер. Независимо от того, есть ли у вас разреженный граф или плотный граф, этот шаг преобладает над всем, что может быть O(V), поэтому просто пишут O(E lg E) вместо O(V + E lg E).

Не могли бы вы дать представление об O (ElogE)?

Afsana Khan 01.05.2018 19:25

Алгоритм Краскала включает в себя сортировку списка ребер, поэтому независимо от того, есть ли у вас разреженный или плотный граф, он будет преобладать над затратами на простую итерацию по неупорядоченному списку. Термин «аддитивный» V не имеет значения в любом случае, поэтому пишут просто O(E lg E), а не O(V + E lg E).

chepner 01.05.2018 19:36

Другие вопросы по теме