haskell中的列表中是否存在差异Ord运算符?

时间:2015-07-02 08:54:18

标签: haskell set-difference

我想在2个整数列表之间设置差异,这允许在haskell中重复。

因此,如果有[1,2,1,4,3] [1,2,4],则差异为[1,3]

目前我可以通过普通的\\运算符listA \\ listB来完成。

但问题是这个太慢了。由于整数在ord组中,因此可以更快地完成。

我知道Data.Multiset模块可以更快地完成它,但是在没有Data.Multiset模块的列表上有没有本地方法呢?

2 个答案:

答案 0 :(得分:6)

  

由于整数在ord组中,因此可以更快地完成。

是的,但需要构建排序索引。这就是Data.Multiset正在做的事情。你当然可以编写一个手动执行此操作的操作,但到那时你将有效地重新实现Multiset

答案 1 :(得分:1)

由于我无法使用Data.MultiSet我需要通过列表来补充我自己的解决方案,所以我将发布解决方案。

为了获得带有重复的两个列表的设置差异,我们首先需要将这些数字组合在一起,以获得每个数字的重复次数:

tupleGroup [] _ = []
tupleGroup (hd:tl) (x, y) 
  | hd == x = (x, succ y) : tupleGroup tl (x, succ y)
  | otherwise = (hd, 1) : tupleGroup tl (hd, 1)

group' [] = []
group' (hd:tl) = tupleGroup tl (hd, 1) 

为了打电话给帮助功能组'我们首先需要对列表进行排序,因为tupleGroup需要一个排序列表。

下一个功能是差异功能,我们在其中提供分组列表:

difference [] [] = []
difference (hd:tl)  [] = fst hd : difference tl []
difference [] (hd:tl) = []
difference (hd1:tl1) (hd2:tl2) 
  | x1 == x2 && y1 > y2 = x1 : difference tl1 tl2
  | x1 == x2 = difference tl1 tl2
  | x1 < x2 = x1 : difference tl1 (hd2:tl2)
  | otherwise = difference (hd1:tl1) tl2
  where 
    x1 = fst hd1
    x2 = fst hd2
    y1 = snd hd1
    y2 = snd hd2

该函数将返回所有数字的列表,其中第一个列表中的重复次数大于第二个列表中的重复次数。