我有一个Text
的列表,它们按排序顺序排列。在我看来,我可以通过将其实现为二进制搜索而不是线性搜索来编写更快的elem
版本。这样的版本是否已经存在?
答案 0 :(得分:12)
Haskell的列表是作为链表实现的,这意味着对i
中任意O(i)
个元素的访问。在正常使用中,列表的elem
二进制搜索版本比标准版本需要更多时间(请参阅@ DanielFischer下面的评论)。
您可能希望使用另一个容器,例如Data.Set或Data.Map,它们是作为平衡二叉树实现的,它提供了O(log n)
访问时间(其中n
1}}是地图/集合中元素的数量。)
答案 1 :(得分:6)
二进制搜索需要随机访问。由于haskell列表不提供随机访问(访问中间的元素需要线性时间),因此二进制搜索没有帮助。
如果您的数据位于提供随机访问的Array
中,则二分搜索是可行的。
答案 2 :(得分:1)
我有一个文本列表,它们按顺序排列。
更改数据结构,您的算法将是显而易见的(用布鲁克斯的话来说)。
对于Haskell来说尤其如此,我们的数据结构通常不是可变数组(这意味着你不会依赖于指针黑客)。
如果您使用例如用于存储文本的堆或树,您将能够轻松地实现 O(log(n)) elem。您可以利用它们排序的事实来提供更快的插入。