Я реализую алгоритм Брона-Кербоша в Clojure для проекта класса и имею некоторые проблемы. Проблема заключается в последних строках алгоритма
BronKerbosch1(R, P, X):
if P and X are both empty:
report R as a maximal clique
for each vertex v in P:
BronKerbosch1(R ⋃ {v}, P ⋂ N(v), X ⋂ N(v))
P := P \ {v} ;This line
X := X ⋃ {v} ;This line
Я знаю, что в Clojure нет смысла «установить x = что-то». Но знайте, что есть функция assoc
, которая, я думаю, похожа. Я хотел бы знать, подходит ли assoc
для завершения моей реализации.
В моей реализации графики представлены так
[#{1 3 2} #{0 3 2} #{0 1 3} #{0 1 2}]
Где 0-й узел представлен как первый набор в векторе, а значения в наборе представляют ребра к другим узлам. Таким образом, приведенное выше представляет собой полный граф с 4 узлами (все узлы связаны со всеми другими узлами).
Пока моя реализация алгоритма
(defn neighV [graph, v]
(let [ret-list (for [i (range (count graph)) :when (contains? (graph i) v)] i)]
ret-list))
(defn Bron-Kerbosch [r, p, x, graph, cliques]
(cond (and (empty? p) (empty? x)) (conj cliques r)
:else
(for [i (range (count p))]
(conj cliques (Bron-Kerbosch (conj r i) (disj p (neighV graph i) (disj x (neighV graph i)) graph cliques)))
)))
Так что сейчас я застрял, изменяя p
и x
в соответствии с алгоритмом. Я думаю, что я могу использовать assoc
для этого, но я думаю, что это применимо только к картам. Можно ли будет использовать, может кто посоветует другую функцию?
assoc
на самом деле неmap a = something
, он возвращает новую карту с измененной или добавленной парой K/V. Итак, если бы существовалоassoc
для наборов, выполнение(assoc someSet 2)
не изменило бы какой-то набор, у вас был бы просто новый набор. - person t_scho   schedule 28.03.2015for
необходимо изменить наreduce
илиloop
, чтобы каждый шаг видел обновленное значение. - person noisesmith   schedule 28.03.2015