List 如何删除具有列表的函数中的重复元素?
说到哈斯克尔,我是个新手,有几件事让我感到困惑。我正在尝试删除此函数列表中的重复元素:List 如何删除具有列表的函数中的重复元素?,list,function,haskell,element,ghci,List,Function,Haskell,Element,Ghci,说到哈斯克尔,我是个新手,有几件事让我感到困惑。我正在尝试删除此函数列表中的重复元素: qsort :: [Int] -> [Int] qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a <= x] larger = [b | b <- xs, b > x]
qsort :: [Int] -> [Int]
qsort [] = []
qsort (x:xs) =
qsort smaller ++ [x] ++ qsort larger
where
smaller = [a | a <- xs, a <= x]
larger = [b | b <- xs, b > x]
但是,如果我进行qsort[2,6,3,3],它仍然返回[2,3,3,6]
我使用的nub函数是错误的还是缺少了其他东西
谢谢您的示例显示您只在空列表(
nub[]
)上使用了nub
,实际上没有任何作用。您必须将其应用于qsort
主体的结果:
qsort :: [Int] -> [Int]
qsort [] = []
qsort (x:xs) =
nub $ qsort smaller ++ [x] ++ qsort larger
where
smaller = [a | a <- xs, a <= x]
larger = [b | b <- xs, b > x]
qsort::[Int]->[Int]
qsort[]=[]
qsort(x:xs)=
nub$qsort较小+++[x]++qsort较大
哪里
较小=[a | a正如在回答中指出的,您需要在最终排序的列表上应用nub
。不幸的是,此函数是O(n^2)
,如果列表变长,将非常无效
如果您将相同的元素组合在一起并只取第一项,这只是一个O(n)
操作,则可以将总体复杂度提高到O(nlogn)
(排序成本)。您可以通过map
、group
和head
功能来实现这一点
根据这些建议,下面是编写函数的另一种方法:
qsort :: [Int] -> [Int]
qsort [] = nub[]
import Data.List
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (pivot:others) = map head $ group $ qsort lowers ++ [pivot] ++ qsort highers
where lowers = filter (<pivot) others
highers = filter (>=pivot) others
请参阅(unique)[软件包中的unique
功能
为什么要在qsort[]=nub[]
中编写[]
?
*Main> qsort [2, 6, 3, 3]
[2,3,6]
unique [2,3,6,6,3]
[2,3,6]