Алгоритм Прима, когда известен диапазон весов ребер

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

Думаю, поскольку алгоритм Прима основан на реализации min-heap, знание весов ребер не поможет ускорить процедуру. Это правильно?


person nikola    schedule 22.08.2013    source источник
comment
Попробуйте дерево Ван Эмде Боаса en.wikipedia.org/wiki/Van_Emde_Boas_tree Вы можете получить журнал журнала В/В нравится это   -  person adrian.budau    schedule 23.08.2013


Ответы (3)


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

person Sebastian    schedule 22.08.2013
comment
Вы предлагаете использовать приоритетную очередь? и если да, то как я могу выполнять операции в O (1), как вы указали. Например. если я включаю вершину в mst, и мне нужно обновить все значения ключа для других вершин в очереди (аналогично операции уменьшения ключа в куче). Как мне это сделать в O(1)? - person nikola; 22.08.2013

Я думаю, что основная идея решения этой проблемы заключается в том, чтобы помнить, что W является константой, поэтому, если вы представляете свою приоритетную очередь как некоторую структуру, размер которой ограничен W, весь список на каждой итерации не изменит временную сложность вашего алгоритма...

Например, если вы представляете свою приоритетную очередь в виде массива T с W + 1 позициями, имеющего связанный список вершин в каждой позиции, так что T[i ] — это список со всеми вершинами, имеющими приоритет, равный i, и использующий T[W + 1] для хранения вершин с приоритетом, равным бесконечности, вы возьмет

O(V) для построения очереди с приоритетом (просто вставьте все вершины в список T[W+1])

O(W), чтобы извлечь минимальный элемент (просто перемещайтесь по T в поисках первой непустой позиции)

O(1) для уменьшения ключа (если вершина v имела ключ, равный i, и он был обновлен до j , просто удалите v из списка T[i] и вставьте в первую позицию списка T[j]).

Таким образом, это даст вам сложность O(VW + E) вместо O(V logV + E).

(Конечно, это не сработает, если диапазон будет от 1 до V, потому что V^2 + E больше, чем V \logV + E).

person Hilder Vitor Lima Pereira    schedule 04.12.2014
comment
Я не совсем понимаю, как ключ уменьшения O (1)? В худшем случае вам придется пройти весь список T[i], который может содержать до V элементов. - person psquid; 28.11.2017

Псевдокод для реализации Prim с небинарной кучей можно найти в Cormen, Introduction to Algorithms, 3rd edition.

Зная диапазон от 1 до k, мы можем создать массив размером k и пройтись по списку, добавляя ребра к соответствующему весу. Это, по характеру его хранения, означает, что ребра сортируются по весу. Это будет O(n+m) времени.

Опираясь на псевдокод алгоритма Прима в Cormen, мы можем проанализировать его сложность и получить результат O(nlog{n} + mlog{n}) = O((n+m)log{n}) времени (Cormen, стр. 636). В частности, шаг 7 и шаг 11 вносят элемент log{n}, который повторяется в цикле n и m. Цикл n log{n} происходит из операции EXTRACT-MIN, а цикл m log{n} - из операции "неявного DECREASE-KEY". Оба могут быть заменены нашим массивом веса ребер, циклом O (k). Таким образом, с нашим модифицированным алгоритмом Прима у нас будет алгоритм O (nk + mk) = O (k (n + m)).

person Viet Than    schedule 18.10.2019