从列表中删除重复项

时间:2010-12-03 08:06:04

标签: list haskell combinators

我有数据类型:

data SidesType = Sides Int Int Int deriving (Show)

我需要一个函数来获取SidesType列表并从中删除重复项。

*Main> let a = [Sides 3 4 5,Sides 3 4 5,Sides 5 12 13,Sides 6 8 10,Sides 6 8 10,Sides 8 15 17,Sides 9 12 15,Sides 5 12 13,Sides 9 12 15,Sides 12 16 20,Sides 8 15 17,Sides 15 20 25,Sides 12 16 20,Sides 15 20 25]
*Main> removeDuplicateFromList [] a
[Sides 3 4 5,Sides 5 12 13,Sides 6 8 10,Sides 6 8 10,Sides 8 15 17,Sides 9 12 15,Sides 5 12 13,Sides 9 12 15,Sides 12 16 20,Sides 8 15 17,Sides 15 20 25,Sides 12 16 20,Sides 15 20 25]

这是我的解决方案:

removeElementFromList :: [SidesType] -> SidesType -> [SidesType]
removeElementFromList lst element  = 
                      let (Sides a b c) = element
                      in [(Sides x y z) | (Sides x y z) <- lst, (x /= a) || (y /= b)]

removeDuplicateFromList :: [SidesType] -> [SidesType] -> [SidesType]
removeDuplicateFromList inlist outlist 
                        | (length outlist) == 0 = inlist
                        | otherwise = 
                          let element = head outlist
                              b = tail outlist
                              filtered = removeElementFromList b element
                      in removeDuplicateFromList (inlist ++ [element]) filtered

我只是想知道是否有其他方法以更多的haskell方式编写此代码?

4 个答案:

答案 0 :(得分:6)

像往常一样,“By”功能增加了灵活性:

nubBy :: (a -> a -> Bool) -> [a] -> [a]

PS虽然它是O(n ^ 2)

答案 1 :(得分:2)

您已经为您的数据类型派生Show。如果您也派生Eq,则可以使用nub中的module Data.List

答案 2 :(得分:0)

使用Data.List.nub

答案 3 :(得分:0)

首先派生订单类:

data XYZ = XYZ .... deriving (Show, Eq, Ord)

或者在Eq实例上写下:

instance Eq XYZ where
a == b = ...

然后聪明并使用树! [计算机科学树从上到下生长!] [1]

import qualified Data.Map.Strict as Map

removeDuplicates ::[a] -> [a]
removeDuplicates list = map fst $ Map.toList $ Map.fromList $ map (\a -> (a,a)) list

长度为N的列表的复杂性(从右到左):

  1. 列表地图:O(N)
  2. Map.fromList:O(N * log N)
  3. Map.toList:O(log N)
  4. 映射列表长度小于或等于N:O(N)
  5. 它们被连续调用,这意味着,各部分的复杂性之间存在优势=&gt; O(2 * N + N * log N + log N)= O(N * log N)

    这比在列表上遍历N ^ 2次更好! 见:wolframAlpha plots。出于比较原因,我还包括2 * N.

    2 + 3:http://hackage.haskell.org/package/containers-0.5.4.0/docs/Data-Map-Strict.html

    [1]:搜索维基百科的计算机科学树