来自nub
的Data.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.
答案 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