我想在2个整数列表之间设置差异,这允许在haskell中重复。
因此,如果有[1,2,1,4,3] [1,2,4]
,则差异为[1,3]
目前我可以通过普通的\\
运算符listA \\ listB
来完成。
但问题是这个太慢了。由于整数在ord组中,因此可以更快地完成。
我知道Data.Multiset
模块可以更快地完成它,但是在没有Data.Multiset
模块的列表上有没有本地方法呢?
答案 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
该函数将返回所有数字的列表,其中第一个列表中的重复次数大于第二个列表中的重复次数。