我有两个函数返回相同大小的结果列表,我试图检查结果是否相同。列表中的订单可能不同。我目前使用以下功能:检查两个列表是否包含相同的元素
lists_are_the_same(List1, List2) ->
List1 -- List2 =:= [].
该函数从另一个列表中减去一个列表并检查结果是否为空列表。问题是,这种方法非常慢,在我的情况下,列表可能相当大。
有没有更快的方法来检查两个列表是否包含完全相同的元素?
我有两个函数返回相同大小的结果列表,我试图检查结果是否相同。列表中的订单可能不同。我目前使用以下功能:检查两个列表是否包含相同的元素
lists_are_the_same(List1, List2) ->
List1 -- List2 =:= [].
该函数从另一个列表中减去一个列表并检查结果是否为空列表。问题是,这种方法非常慢,在我的情况下,列表可能相当大。
有没有更快的方法来检查两个列表是否包含完全相同的元素?
一个更快的方式进行排序每个列表,然后对它们进行比较如下:基于对Steve评论
lists_are_the_same(List1, List2) ->
lists:sort(List1) =:= lists:sort(List2).
,要知道Erlang的所有值都进行排序,并且有defined order是很重要的,所以它适用于所有可能的列表元素。
如果您的所有元素都是唯一您可能需要使用ordsets
而不是lists
。您也可以documentation查看关于使用A -- B
操作:
的的
lists:subtract(A, B)
复杂性是成正比length(A)*length(B)
,这意味着它是非常缓慢的,如果两个A
和B
是 长列表。 (如果两个清单很长,它是一个更好的选择使用 有序列表和ordsets:subtract/2
然后你就可以检查它们是否通过平等:
ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1)
+1 。这似乎比排序快得多,然后在我的微型基准中比较相等但整齐的整数列表。 – Dogbert
在Erlang中所有的值都是排序,因为类型有一个[定义的总顺序](http://erlang.org/doc/reference_manual/expressions.html#id81064)。 –
@SteveVinoski这是对的,我在答案中提到了你的内容丰富的评论。谢谢。 –