2016-09-19 1 views
5

J'ai deux fonctions qui renvoient des listes de résultats de la même taille et j'essaie de vérifier si les résultats sont les mêmes. L'ordre dans les listes peut être différent. J'utilise actuellement la fonction suivante:Vérifiez si deux listes sont composées des mêmes éléments

lists_are_the_same(List1, List2) -> 
    List1 -- List2 =:= []. 

Cette fonction soustraient une liste à l'autre et vérifie si le résultat est une liste vide. Le problème est, une telle méthode est très lente et dans mon cas les listes peuvent être assez grandes.

Existe-t-il un moyen plus rapide de vérifier si deux listes se composent exactement des mêmes éléments?

Répondre

6

Une manière plus rapide est le tri chaque liste, puis de les comparer comme suit:

lists_are_the_same(List1, List2) -> 
    lists:sort(List1) =:= lists:sort(List2). 

Basé sur le commentaire de Steve, il est important de savoir que toutes les valeurs Erlang sont triables et ont defined order, donc cela fonctionne pour tous les éléments de liste possibles.

+7

En Erlang toutes les valeurs sont triables, puisque les types ont un [ordre total défini] (http://erlang.org/doc/reference_manual/expressions.html#id81064). –

+0

@SteveVinoski C'est exact, j'ai mentionné votre commentaire informatif dans la réponse Merci –

2

Dans le cas où tous vos éléments sont unique vous pouvez utiliser ordsets au lieu de lists. Vous pouvez voir aussi le documentation sur l'utilisation A -- B opération:

La complexité de lists:subtract(A, B) est proportionnelle à length(A)*length(B), ce qui signifie qu'il est très lent si les deux A et B sont longues listes. (Si les deux listes sont longues, il est un bien meilleur choix d'utiliser listes ordonnées et ordsets:subtract/2

Ensuite, vous pouvez vérifier si elles sont égales par:.

ordsets:is_subset(List1,List2) andalso ordsets:is_subset(List2,List1) 
+1

+1 Cela semble être beaucoup plus rapide que le tri puis la comparaison dans mes micro-repères de la liste des entiers égaux mais mélangés. – Dogbert