【问题标题】:is there union and intersect Haskell Prelude implementation?是否有联合和相交 Haskell Prelude 实现?
【发布时间】:2011-05-13 03:11:50
【问题描述】:

Standard Prelude 函数中是否有实现并集和集合交集的功能?

union      :: (Eq a) => [a] -> [a] -> [a]
intersect  :: (Eq a) => [a] -> [a] -> [a]

如果不是,有人可以说我的实现是否有效,(充分利用惰性和前奏功能)

unionSet :: (Eq a) => [a] -> [a] -> [a]
unionSet as bs = foldl (\xs y -> if elem y xs then xs else xs ++ [y]) as bs

intersectSet :: (Eq a) => [a] -> [a] -> [a]
intersectSet as bs = let ns = [ a | a <- as, elem a bs] in [ b | b <- bs, elem b ns]

【问题讨论】:

    标签: data-structures haskell set


    【解决方案1】:

    在标准库的列表中有unionintersect 函数,它们位于Data.List,但不在Prelude 本身中。

    就效率而言,我将对以上所有内容说“不”,包括您的和标准库的。在只有Eq 约束的列表上,真的没有办法进行有效的操作。也就是说,您仍然可以在 Data.List 信息中找到实现——请参阅上面的链接,我已直接指向相关来源。

    编辑 -- 作为一个简短的附录,以供后人参考,请务必查看 Don 对您实际想要用于此目的的回答,而不是“这些功能是否存在”的狭义问题。

    【讨论】:

      【解决方案2】:

      正如 camccann 所指出的,基础库提供了列表版本。如果您想要更高效的东西,请考虑 Data.Set,它提供:

      union :: Ord a => Set a -> Set a -> Set a
      
      intersection :: Ord a => Set a -> Set a -> Set a
      

      复杂度O(n+m).

      【讨论】:

      • 请注意,Ord 约束和像Set 这样的具有隐藏表示的数据结构在具有任何合理效率的情况下是您真正可以获得的通用性。几乎所有其他东西要么效率非常低,要么存储的内容更加有限。
      猜你喜欢
      • 1970-01-01
      • 2020-08-31
      • 2011-05-28
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多