Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Abonnements

Quizz 8

Comme je l'ai dit dans les commentaires du Quizz 7, l'idée maintenant est de faire l'équivalent de ceci :

values.Aggregate((v1, v2) => v1.TakeWhile((v, index) => v2.Count() > index && v == v2.ElementAt(index)));

en utilisant un seul IEnumerator sur v2 pour chaque itération sur v1.

Enjoy Smile

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Publié mercredi 13 août 2008 13:05 par Matthieu MEZIL

Classé sous : , , ,

Commentaires

# re: Quizz 8 @ mercredi 13 août 2008 13:34

Un let v3 = v2.ToArray() ?

Ensuite, on peut remplacer v2.count() par v3.lenght et elementAt par [].

Je n'utilise qu'un Enumerator par v2 existant mais je dois créer un tableau...

FREMYCOMPANY

# re: Quizz 8 @ mercredi 13 août 2008 14:06

Comme le faisait justement remarquer Simon M dans le Quizz 1, ce n'est pas idéal le ToArray.

De plus cela signie que tu vas parcourir deux fois tes valeurs : une fois pour faire le ToArray et une fois pour récupérer les éléments de ton tableau 1 par 1.

Par contre, tu risques d'avoir plus de difficultés que les autres. En effet, le code que je propose ne marche pas en VB 9 (sauf erreur de ma part). Il n'est valable que pour C#3. Je reviendrais sur ça tout à l'heure.

Matthieu MEZIL

# re: Quizz 8 @ jeudi 14 août 2008 09:38

Personne ?

Allez je vous donne un petit indice à travers la question suivante : qu'est-ce qu'une lambda expression ?

Matthieu MEZIL

# re: Quizz 8 @ jeudi 14 août 2008 11:03

Je vois pas en quoi savoir ce qu'est une Lambda Expression pourrait nous aider, mais j'ai peut-être trouvé la solution... Seulement comme je n'ai pas droit aux délégués anonymes, je dois créer une seconde fonction. Sans doute qu'en C# cela pourrait être fait en une seule.

Par contre, j'ai testé et c'est toujours plus lent que ma solution première en VB8.

   Function CommonStart(ByVal values As IEnumerable(Of IEnumerable(Of Integer))) As IEnumerable(Of Integer)

       Return values.Aggregate(AddressOf CommonStartPredicate)

   End Function

   Function CommonStartPredicate(ByVal v1 As IEnumerable(Of Integer), ByVal v2 As IEnumerable(Of Integer)) As IEnumerable(Of Integer)

       Dim Enumerator As IEnumerator(Of Integer) = v2.GetEnumerator

       Return v1.TakeWhile(Function(v, index) Enumerator.MoveNext() AndAlso v = Enumerator.Current)

   End Function

FREMYCOMPANY

# re: Quizz 8 @ jeudi 14 août 2008 11:33

Bien joué Wink

Effectivement quand je disais que ce n'était pas possible en VB9, c'est parce qu'en VB9 on est obligé de créer une nouvelle fonction.

En C#, une Lambda Expression ce n'est rien d'autre qu'un délégué anonyme.

En VB, c'est un peu moins que ça car on ne peut mettre que la valeur de retour.

Mais en C#, on peut mettre du vrai code. Ce qui nous donne dans notre exemple :

static IEnumerable<int> CommonBegining(IEnumerable<IEnumerable<int>> values)

{

    return values.Aggregate((v1, v2) =>

    {

        IEnumerator<int> v2Enumerator = v2.GetEnumerator();

        return v1.TakeWhile(v => v2Enumerator.MoveNext() && v == v2Enumerator.Current);

    });

}

Matthieu MEZIL

# re: Quizz 8 @ jeudi 14 août 2008 11:42

Qu'est-ce que vous en pensez ? Sympa non ?

@ Fremy : dans ton exemple, tu ne devrais pas t'embarraser de l'index dans le TakeWhile:

Return v1.TakeWhile(Function(v) Enumerator.MoveNext() AndAlso v = Enumerator.Current)

Matthieu MEZIL

# re: Quizz 8 @ jeudi 14 août 2008 12:39

J'aime beaucoup le code, c'est assez sexy.

Par contre, c'est toujours plus lent que la méthode de Simon, pas de beaucoup c'est vrai.

Sur ma machine, pour 1 million d'appelles sur les 2 tableaux de ton Quizz précedent, j'ai les résultat suivant:

Simon: 6"50

Quizz7: 14"95

Quizz8: 7"81

Sacha

# re: Quizz 8 @ jeudi 14 août 2008 14:16

Pas moi. Moi j'ai 6,187 secondes pour le mien et 8,204 pour la méthode de Simon !

Le Dual Core peut-être ?

Tu as un proc momo-core ?

Matthieu MEZIL

# re: Quizz 8 @ vendredi 15 août 2008 13:47

Voici comment je teste:

Random r = new Random(0); // jamais variable

Stopwatch sw = new Stopwatch();

sw.Start();

decimal d = 0;

int firstMax = 10;

int secondMax = 1000;

int rangeMax = 10;

for (int i = 0; i &lt; 100000; i++)

{

   int[][] v = new int[r.Next(firstMax)][];

   for (int j = 0; j &lt; v.Length; j++)

   {

       v[j] = new int[r.Next(secondMax)];

       for (int k = 0; k &lt; v[j].Length; k++)

       {

           v[j][k] = r.Next(rangeMax);

       }

   }

   foreach (int ei in CommonBegining(v))

   {

       d += ei; // force à ne pas optimiser une boucle vide

   }

}

sw.Stop();

Console.WriteLine("d=" + d + " e=" + sw.Elapsed);

Les deux méthodes (bibi &amp; Quizz8) sont en effet tout à fait équivalentes en perf (j'ai du rajouter un test dans quizz8 si values est vide). C'est normal car elles sont tout à fait équivalentes, même à les regarder. D'ailleurs, je trouve quizz8 beaucoup plus lisible que les précédentes versions (en ce qui me concerne :-).

PS: je ne connaissais pas le proc "momo core" :-) :-)

smo

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01