Haskell,算法和学校

时间:2011-07-22 23:39:45

标签: haskell

我开始怀疑我的Haskell和函数编程的计划是否适用于我的下一个算法课程是否很好。

为了得到一些Haskell线,我开始尝试实现一些简单的算法。第一:稳定婚姻问题的Gale-Shapley。尚未进入monad,所有可变状态看起来令人生畏,所以我使用稳定匹配的表征作为半匹配点阵上映射的固定点。这很有趣,但它不再是Gale-Shapley而且复杂性并不好(格子中的那些链子显然可以很长很长时间了)。

接下来,我有平面中最近点对的算法,但我仍然坚持获得通常的O(n * log n)复杂度,因为我无法弄清楚如何获得类似于集合的数据结构O(1)检查会员资格。

所以我的问题是:一般可以实现大多数算法,例如。 Dijkstra,Ford-Fulkerson(Gale-Shapley!?)如果能更好地掌握Haskell和函数式编程,那么从程序实现中获得复杂性?

3 个答案:

答案 0 :(得分:15)

一般来说,这可能无法回答。许多标准算法是围绕可变性设计的,并且在某些情况下存在翻译,而在其他情况下则不存在。有时存在具有相同性能特征的替代算法,有时您确实需要可变性。

如果您想了解如何在此设置中处理算法,那么一个好的起点是Chris Okasaki的书Purely Functional Data Structures。这本书是他论文的扩展版本,available online in PDF format

如果你需要特定算法的帮助,例如O(1)成员资格检查(这实际上是误导性的 - 没有这样的东西,这样的数据结构通常有类似O(k)的东西,其中k是元素的大小存储)你最好把它作为一个特定的单一问题,而不是像这样的一般性问题。

答案 1 :(得分:3)

由于您在Haskell中拥有ST monad,因此您可以使用命令式语言的相同速度执行任何可变状态。在外面它可以有一个非monadic接口。 例如,见Launchbury和Peyton-Jones:“懒惰的功能状态线程” http://portal.acm.org/citation.cfm?id=178246

答案 2 :(得分:0)

Existence proof用于实现具有可变数据结构的算法。只需递归IO记录即可。在这种情况下,一个包含相关变量的游戏记录。