2012-04-17 24 views

回答

12

Haskell的列表是作为链接列表实现的,这意味着访问任意i的元素在O(i)。在正常使用情况下,列表的二进制搜索版本elem需要比标准版本更多的时间(请参阅下面的@ DanielFischer的评论)。

您可能希望使用一个不同的容器,如Data.SetData.Map,即实现为平衡二叉树,这给给你O(log n)访问时间(其中n是在图/集合中元素的个数)。

+2

['Data.Set'](http://www.haskell.org/ghc/docs/latest/html/libraries/containers-0.4.2.1/Data-Set.html)可能是更合适的容器切换到。 – dave4420 2012-04-17 09:40:04

+0

@ dave4420:加了,谢谢。我完全忘了提及它:) – 2012-04-17 09:45:42

+2

['Data.HashSet'](http://hackage.haskell.org/packages/archive/unordered-containers/latest/doc/html/Data-HashSet.html)可能是一个可能性也是。 – huon 2012-04-17 09:46:19

6

二进制搜索需要随机访问。由于haskell列表不提供随机访问(访问中间的元素需要线性时间),二进制搜索不会有帮助。

如果您的数据位于Array(提供随机访问),二进制搜索将是可行的。

1

我有一个文本列表,它们按排序顺序。

改变数据结构,你的算法将是显而易见的(用布鲁克斯来解释)。

Haskell尤其如此,我们的数据结构通常不是以可变数组的形式出现的(也就是说,您不必依靠指针黑客行为)。

如果您使用例如一个堆或树来存储你的文本,你就可以实现简单的实现。你可以利用他们排序的事实来提供更快的插入。