2010-02-15 8 views
40

Étant donné 2 tableaux int, par exemple, foo et bar, quel est le moyen le plus efficace de vérifier que la barre de tableau contient au moins un élément que foo contient. devrait renvoyer vrai/faux. Je soupçonne foreach imbriqué mais je me demandais juste s'il y a une meilleure façon.vérifier si un tableau contient un élément d'un autre tableau

+0

Est-ce ce devoir? Les tableaux sont-ils arbitrairement grands, ou plus petits que, disons, 100 éléments? Avez-vous essayé autre chose que la force brute? –

+0

pas ses devoirs! ... juste pensé qu'il y a probablement une bonne façon de le faire. – raklos

Répondre

87

LINQ:

array1.Intersect(array2).Any() 
+3

L'utilisation de Any() garantit que l'algorithme d'intersection s'arrête lorsque le premier objet égal est trouvé. – Olli

+5

gardez à l'esprit que tout array1 est énuméré, donc vous voudrez probablement le tableau le plus court comme array1 si possible. –

+2

Je n'ai jamais entendu parler de la méthode Intersect, donc j'ai dû chercher ce que ça fait: http://msdn.microsoft.com/fr -us/library/bb460136.aspx Il vous donne essentiellement une liste d'éléments qui se trouvent dans les deux tableaux comparés. Avec l'opérateur any vous savez alors si array1 et array2 ont l'une des mêmes chaînes dans ce cas. – Stefanvds

1

Oui boucles imbriquées, bien que l'on est caché:

bool AnyAny(int[] A, int[]B) 
{ 
    foreach(int i in A) 
     if (B.Any(b=> b == i)) 
      return true; 
    return false; 
} 
6

C# 3:

bool result = bar.Any(el => foo.Contains(el)); 

C# 4 exécution parallèle:

bool result = bar.AsParallel().Any(el => foo.AsParallel().Contains(el)); 
+0

Dans mon cas, foo est une sous-chaîne de el. donc, 'bool result = bar.Any (el => foo.Contains (el));' ne donnera pas le résultat requis. Toute suggestion sur la façon d'implémenter cette requête? –

0

Pour une approche par grappes aléatoires, votre méthode semble être la plus rapide. Il y a des méthodes qui rendraient les choses plus efficaces si l'une ou les deux matrices sont triées, leurs limites supérieure/inférieure sont connues, ou l'une d'elles change beaucoup plus rarement que l'autre et vous effectuez de nombreuses vérifications. La chose est que vous pouvez préparer divers hashes, indices et astuces qui optimisent la recherche à presque rien, mais le processus d'indexation seul prendra généralement plus d'une recherche.

Questions connexes