Ces deux questions donnent algorthims similaires pour brouiller un IEnumerable:Y a-t-il une différence de performance entre ces deux algorithmes pour mélanger un IEnumerable?
- C#: Is using Random and OrderBy a good shuffle algorithm?
- Can you enumerate a collection in C# out of order?
Voici les deux méthodes côte à côte:
public static IEnumerable<T> Shuffle1<T> (this IEnumerable<T> source)
{
Random random = new Random();
T [] copy = source.ToArray();
for (int i = copy.Length - 1; i >= 0; i--) {
int index = random.Next (i + 1);
yield return copy [index];
copy [index] = copy [i];
}
}
public static IEnumerable<T> Shuffle2<T> (this IEnumerable<T> source)
{
Random random = new Random();
List<T> copy = source.ToList();
while (copy.Count > 0) {
int index = random.Next (copy.Count);
yield return copy [index];
copy.RemoveAt (index);
}
}
Ils sont fondamentalement identique, sauf un utilise un List
, et on utilise un tableau. Conceptuellement, le second me semble plus clair. Mais y a-t-il un avantage substantiel de performance à gagner en utilisant un tableau? Même si le temps Big-O est le même, s'il est plusieurs fois plus rapide, cela pourrait faire une différence notable.
Vous avez écrit le code dans les deux sens. Si vous voulez savoir lequel est le plus rapide * exécutez le code * et vous le saurez. C'est un mystère pour moi pourquoi tant de gens postent "lequel est plus rapide?" des questions. Il doit sûrement être à la fois plus rapide et plus précis de simplement exécuter le code dans les deux sens en étant assis à votre bureau plutôt que de demander Internet et d'attendre que quelqu'un d'autre le fasse fonctionner pour vous, ou devinez. –
@Matthew toujours poster votre propre indice de référence, puis demandez à ABT sa raison de mieux. – nawfal