我有兩個函數返回相同大小的結果列表,我試圖檢查結果是否相同。列表中的訂單可能不同。我目前使用以下功能:檢查兩個列表是否包含相同的元素
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這是對的,我在答案中提到了你的內容豐富的評論。謝謝。 –