更快的`elem`在Haskell中使用二进制搜索

时间:2012-04-17 09:07:06

标签: haskell

我有一个Text的列表,它们按排序顺序排列。在我看来,我可以通过将其实现为二进制搜索而不是线性搜索来编写更快的elem版本。这样的版本是否已经存在?

3 个答案:

答案 0 :(得分:12)

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

您可能希望使用另一个容器,例如Data.SetData.Map,它们是作为平衡二叉树实现的,它提供了O(log n)访问时间(其中n 1}}是地图/集合中元素的数量。)

答案 1 :(得分:6)

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

如果您的数据位于提供随机访问的Array中,则二分搜索是可行的。

答案 2 :(得分:1)

  

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

更改数据结构,您的算法将是显而易见的(用布鲁克斯的话来说)。

对于Haskell来说尤其如此,我们的数据结构通常不是可变数组(这意味着你不会依赖于指针黑客)。

如果您使用例如用于存储文本的堆或树,您将能够轻松地实现 O(log(n)) elem。您可以利用它们排序的事实来提供更快的插入。