Время работы алгоритма Крускала

Алгоритм Крускала следующий:

MST-KRUSKAL(G,w)
1. A={}
2. for each vertex v∈ G.V
3.      MAKE-SET(v)
4. sort the edges of G.E into nondecreasing order by weight w
5. for each edge (u,v) ∈ G.E, taken in nondecreasing order by weight w
6.      if FIND-SET(u)!=FIND-SET(v)   
7.         A=A U {(u,v)}  
8.         Union(u,v)
9. return A

По моему учебнику:

Инициализация множества A в строке 1 занимает O(1) времени, а время сортировки ребер в строке 4 равно O(E lgE). Цикл for в строках 5–8 выполняет операции O(E) FIND-SET и UNION в лесу непересекающихся множеств. Наряду с |V| Операции MAKE-SET занимают в общей сложности O((V+E)α(V)) времени, где α — очень медленно растущая функция. Поскольку мы предполагаем, что G связна, мы имеем |E| ‹= |V|-1, поэтому операции над непересекающимися множествами занимают время O(E α(V)). Более того, поскольку α(V)=O(lgV)=O(lgE), общее время работы алгоритма Крускала составляет O(E lgE). Заметив, что |E|‹|V|^2, мы имеем lg |E|=O(lgV), поэтому мы можем переформулировать время работы алгоритма Крускала как O(E lgV).

Не могли бы вы объяснить мне, почему мы делаем вывод, что время сортировки ребер в строке 4 равно O(E lgE)? Также как мы получаем, что общая временная сложность равна O((V+E)α(V)) ?

Кроме того, предположим, что все веса ребер в графе являются целыми числами от 1 до |V|. Как быстро вы можете заставить работать алгоритм Крускала? Что, если веса ребер являются целыми числами в диапазоне от 1 до W для некоторой константы W?

Как временная сложность зависит от веса ребер?

ИЗМЕНИТЬ:

Кроме того, предположим, что все веса ребер в графе являются целыми числами от 1 до |V|. Как быстро вы можете заставить работать алгоритм Крускала?

Я подумал следующее:

Чтобы алгоритм Крускала работал быстрее, мы можем отсортировать ребра, применяя сортировку подсчетом.

  • Строка 1 требует O(1) времени.
  • Строки 2-3 требуют времени O(v).
  • Строка 4 требует O(|V|+|E|) времени.
  • Строки 5-8 требуют O(|E|α(|V|)) времени.
  • Строка 9 требует O(1) времени.

Итак, если мы используем сортировку подсчетом для решения ребер, временная сложность Крускала будет

введите здесь описание изображения

Скажите, верна ли моя идея?

Также:

Что, если веса ребер являются целыми числами в диапазоне от 1 до W для некоторой константы W?

Мы снова будем использовать сортировку подсчетом. Алгоритм будет тот же. Находим временную сложность следующим образом:

  • Строка 1 требует O(1) времени.
  • Строки 2-3 требуют времени O(|V|).
  • Строка 4 требует O(W+|E|)=O(W)+O(|E|)=O(1)+O(|E|)=O(|E|) времени.
  • Строки 5-8 требуют O(|E|α(|V|)) времени.
  • Строка 9 требует O(1) времени.

Таким образом, временная сложность будет:

введите здесь описание изображения


person Mary Star    schedule 10.04.2015    source источник


Ответы (1)


Не могли бы вы объяснить мне, почему мы делаем вывод, что время сортировки ребер в строке 4 равно O(E*lgE)?

Для сортировки набора из N элементов мы используем алгоритм O(Nlg(N)) — быструю сортировку, сортировку слиянием или сортировку в куче. Следовательно, для сортировки E ребер нам потребуется время O(Elg(E)). Однако в некоторых случаях это не обязательно, так как мы могли бы использовать алгоритм сортировки с большей сложностью (читайте далее).

Также как мы получаем, что общая временная сложность равна O((V+E)α(V))?

Я не думаю, что общая сложность равна O((V+E)α(V)). Это будет сложность 5-8 петель. Сложность O((V+E)α(V)) связана с операциями V MAKE-SET и операциями E Union. Чтобы выяснить, почему мы умножаем это на α(V), вам нужно будет прочитать подробный анализ структуры данных непересекающихся множеств в какой-нибудь книге по алгоритмам.

Как быстро вы можете заставить работать алгоритм Крускала?

Для первой части, строки 4, у нас есть сложность O(E*lg(E)) и для второй части, строки 5-8, у нас есть сложность O((E+V)α(V)) . В сумме эти два результата дают сложность O(Elg(E)). Если мы используем сортировку O (N * lg (N)) это не может быть улучшено.

Что, если веса ребер являются целыми числами в диапазоне от 1 до W для некоторой константы W?

Если это так, то мы могли бы использовать сортировку подсчетом для первой части. Предоставление строки 4 сложности O (E + W) = O (E). В этом случае алгоритм будет иметь общую сложность O((E+V)*α(V)) . Обратите внимание, однако, что O(E + W) в действительности включает константу, которая может быть довольно большой и может быть непрактичной для больших W.

Как временная сложность зависит от веса ребер?

Как уже говорилось, если вес ребер достаточно мал, мы можем использовать сортировку подсчетом и ускорить алгоритм.

РЕДАКТИРОВАТЬ:

Кроме того, предположим, что все веса ребер в графе являются целыми числами от 1 до |V|. Как быстро вы можете заставить работать алгоритм Крускала? Я подумал следующее:

Чтобы алгоритм Крускала работал быстрее, мы можем отсортировать ребра, применяя сортировку подсчетом.

Строка 1 требует O(1) времени. Строки 2-3 требуют O(vα(|V|)) времени. Строка 4 требует O(|V|+|E|) времени. Строки 5-8 требуют O(|E|α(|V|)) времени. Строка 9 требует O(1) времени.

Ваша идея верна, однако вы можете уменьшить границы.

Строки 2-3 требуют O(|V|), а не O(|V|α(|V|)). Однако мы упростили его до O(|V|α(|V|)) в предыдущих вычислениях, чтобы упростить расчеты.

При этом вы получаете время: O(1) + O(|V|) + O(|V| + |E|) + O(|E|α(|V|)) + O(1) = O (|V| + |E|) + O(|E|α(|V|))

Вы можете упростить это либо до O((|V| + |E|) * α(|V|), либо до O(|V| + |E|*α(|V|).

Итак, хотя вы были правы, поскольку O((|V| + |E|) * α(|V|) ‹ O((|V| + |E|) * lg(|E|)

Расчеты для |W| аналогичны.

person Neithrik    schedule 10.04.2015
comment
Рико Ю сказал, что O((V+E)α(V)) будет сложностью цикла 5-8. Сложность O((V+E)α(V)) связана с операциями V MAKE-SET и операциями E Union. Но в этом цикле for у нас нет операций MAKE-SET. Так что, мы также принимаем во внимание другой цикл for? Если да, то почему мы можем это сделать, если количество циклов for не одинаково? Также вы сказали, что для строки 4 у нас сложность O(ElgE), а для строк 5-8 сложность O((E+V)α(V)) . Значит, мы не принимаем во внимание первый цикл for? И как, если мы суммируем эти два значения, получим O(ElgE)? - person Mary Star; 10.04.2015
comment
Кроме того, что представляет собой N при временной сложности O(N*lg(N))? Кроме того, можем ли мы использовать сортировку подсчетом только в том случае, когда веса ребер являются целыми числами в диапазоне от 1 до W, но не когда они находятся в диапазоне от 1 до |V|? Если да, то почему это так? Кроме того, почему сложность строки 4 равна O(E+W)? - person Mary Star; 10.04.2015
comment
Да, мой плохой, вам также нужно считать первую петлю. Строки 2-3 и 5-8 вместе дадут сложность O((V+E)α(V)) . Если мы суммируем O(ElgE) и O((E+V)α(V)) мы получим O(ElgE), потому что O((E+V)α(V)) ‹ O(ElgE). - person Neithrik; 10.04.2015
comment
N представляет количество элементов, которые мы сортируем. Неважно, в каком диапазоне они находятся, но этот диапазон должен быть разумно небольшим. Чтобы лучше понять сортировку подсчета, прочитайте об этом здесь: en.wikipedia.org/wiki/Counting_sort - person Neithrik; 10.04.2015
comment
Рико Итак, временная сложность строк 2-3 равна O(Vα(V)) ? Тоже такое? O(ElgE)+O((E+V)α(V))=O(ElgE)+O((V+E)*lgE), поскольку α(V)=O(lgE) и O(ElgE)+ O((V+E)*lgE)=O(ElgE+VlgE+ElgE)=O((V+E)*lgE). Тогда мы знаем, что |E|‹=|V|-1, потому что мы предполагаем, что G связна. Так разве это не следующее? (V+E)*lgE‹=(2V-1)*lgE=O(VlgE) или я ошибаюсь? Как мы выводим, что O(ElgE)+O((E+V)α(V))=O(E*lgE) ? - person Mary Star; 10.04.2015
comment
Да, и да, ваши расчеты верны до такой степени, что вы предполагаете, что |E| ‹= |V|-1. Если граф связный, мы знаем, что число ребер не меньше |V| - 1. Сделать это уравнение |E| ›= |V|-1. Если вы измените это, вы получите O (Elg (E)) - person Neithrik; 10.04.2015
comment
О, да, Рико, ты прав... Поскольку |E|›=V-1, мы имеем (V+E)*lgE‹=(2E+1)*lgE=O(E*lgE). Я нашел это: сортировка подсчетом предполагает, что каждый из n вводимых элементов является целым числом в диапазоне от 0 до k для некоторого целого числа k. Когда k=O(n), сортировка выполняется за время Θ(n). Не означает ли это, что линия 4 требует Θ(W) времени? Или я неправильно понял? - person Mary Star; 10.04.2015
comment
Давайте продолжим обсуждение в чате. - person Mary Star; 10.04.2015
comment
Рико, я отредактировал свой пост. Не могли бы вы взглянуть на это? - person Mary Star; 14.04.2015
comment
Рико, не могли бы вы объяснить мне, почему строки 2-3 требуют O(V), а не O(Vα(|V|))? - person Mary Star; 15.04.2015
comment
Вы должны создать наборы V. Чтобы создать один набор, вы тратите O (1), поэтому вам нужно V * O (1) = O (V), чтобы создать V из них. - person Neithrik; 15.04.2015
comment
Рико Хорошо, я сделаю это. Известно ли, что MAKE-SET(v) требует постоянного времени или нам нужно это доказывать? Если это занимает постоянное время, это из-за того, что мы помещаем элемент в список? - person Mary Star; 15.04.2015
comment
Нет необходимости доказывать это. Это похоже на помещение элемента в список. Он просто создает пустой набор, поэтому он, безусловно, имеет постоянное время, так как всегда занимает одно и то же время. - person Neithrik; 15.04.2015
comment
Правильно, но нет необходимости заменять alpha(V) на lg(V), этим вы просто убиваете точность результата. - person Neithrik; 15.04.2015
comment
Рико Найс.. Большое спасибо!!! :-) Не могли бы вы также взглянуть на этот вопрос? stackoverflow.com/questions/29594568/ Вы представляете, как быстро мы можем заставить работать алгоритм Прима? Что мы можем сделать? - person Mary Star; 15.04.2015
comment
Не нужно меня благодарить :) просто проголосуйте и примите :) что касается другого вопроса, амальсом дал хороший ответ, за который я проголосовал, добавить особо нечего. - person Neithrik; 15.04.2015
comment
Нет, я нашел это: eng-hs.net/files/ Algorithms-Solutions-CH-23.pdf и на странице 17 они обнаружили, что временная сложность составляет O(E α(V)) . Как они избавились от V в точке O(V+E+Eα(V)) ? @Рико - person Mary Star; 15.04.2015
comment
V ‹ E, следовательно, O(V) ‹ O(E). Мы также знаем, что O(E) = O(Eα(V)). - person Neithrik; 15.04.2015
comment
V‹=E-1 выполняется, только если граф G связен, верно? Так мы предполагаем это? - person Mary Star; 15.04.2015
comment
Да, мы предполагаем, что это связано, поскольку, если это не так, вы все равно не сможете найти связующее дерево. - person Neithrik; 15.04.2015
comment
Рико, не могли бы вы взглянуть на это: stackoverflow.com/questions/29871890/ ? - person Mary Star; 27.04.2015