为什么" nub"它可能是O(n)时有O(n ^ 2)的复杂度?

时间:2014-06-26 04:48:53

标签: haskell

来自nubData.list函数具有O(n 2 )复杂度。很明显,实现O(n)算法是可行的而不是难的。为什么哈斯克尔不这样做?

nub :: Eq a => [a] -> [a]
base Data.List
O(n^2). The nub function removes duplicate elements from a list. In particular,
it keeps only the first occurrence of each element. (The name nub means
`essence'.) It is a special case of nubBy, which allows the programmer to supply
their own equality test. 

1 个答案:

答案 0 :(得分:35)

在评论中提供相当痛苦明确的答案:您的前提是错误的,nub :: Eq a => [a] -> [a]无法实现O(n)

您可能正在考虑可以假设排序的实现,ordNub :: Ord a => [a] -> [a],这通常是线性日志。或者你可能正在假设一种可以清洗,可以排序的东西。与Eq不同,当您有订购信息时,您不需要比较每对元素。

2008年讨论了这个主题:http://haskell.1045720.n5.nabble.com/GHC-2717-Add-nubWith-nubOrd-td3159919.html

2013年再次讨论了该主题,社区中几乎完全不同的参与者:https://www.haskell.org/pipermail/haskell-cafe/2013-October/110984.html