【发布时间】:2014-05-29 11:23:13
【问题描述】:
我用任何命令式语言实现这个算法都没有问题,但我在用 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
【问题讨论】:
-
你能用命令式语言提供算法吗?
-
你能展示一下 data.txt 中的一行吗?如果一个人不知道该文件中的数据将如何形成,就很难分辨出什么是预期的和什么是错误。我假设使用
read-string和rest每一行都是一个 Clojure 序列。 -
抽象的描述看起来并不十分必要。 en.wikipedia.org/wiki/…
-
一般来说,函数式编程的想法是提供所有将函数参数化为附加参数的“状态”,并在函数的返回值中返回所有“状态变化”(然后使用这些调用函数中的新值)。我开始研究算法的纯函数 clojure 实现,基于解决方案 here 并将图形作为输入和输出传递给每个函数,但这对于现在的答案来说有点多 - 我可能会跟进如果没有其他人做,另一次翻译。
-
此外,这里的代码远不是算法的实现,并且充斥着对数据类型和函数的滥用。
标签: algorithm graph clojure functional-programming imperative-programming