我用任何命令式语言实现这个算法都没有问题,但我正在努力用 Clojure 或任何其他函数式语言实现它。许多算法都是根据使用可变数据结构和命令式循环来描述的,我很难将所有这些都转换为功能域。
这是我在 Clojure 中使用邻接列表作为图形表示来实现它的不完整尝试(草稿,而不是工作实现):
(ns karger.core
(:require [clojure.string :as string]))
(defn load-data []
(zipmap
(range 1 1000)
(map rest (map read-string
(string/split (slurp "data.txt") #"\n")))))
(defn min-cut [graph]
(let [start (rand-int (count graph))
end (rand-int (graph start))
start-list (nth graph start)]
(for [x (graph end)
:when (not= x start)]
(assoc graph start (conj start-list x)))
))
(count (load-data))
谁能给我这个算法的参考实现(最好用 Clojure 编写)?另外,如果有人给我一个一般性建议,将命令式术语描述的算法转换为功能域,我也想知道。
提前致谢!
更新#1
这是用 Python 编写的算法实现的链接:http: //pastebin.com/WwWCtxpu