Tu as bien analysé mon commentaire.
Tu as raison sur le fait que la présentation de valgrind ne "fait pas de mal". Ce n'est pas le point le plus important
du message : ce que je reproche dans le fond ce sont les considérations bas niveau sur les vecteurs de bits qui nuisent
(à mon avis) à la qualité de la programmation. La partie sur valgrind n'a fait que renforcer mon sentiment d'ensemble
d'une certaine ínsistance un peu futile sur des considérations bas niveau, elle n'a rien à se reprocher en elle-même.
Cependant, je ne suis pas sûr que sa place soit dans une correction d'exercices, même détaillées. L'impression qui
ressort de cette partie, c'est que les correcteurs se sont amusés à profiler et optimiser à fond cet algorithme, et
qu'ils ont décidé d'en faire part aux canditats.
Ça ressemble donc plus à un léger trip technique sur une question qui n'en valait pas forcément la peine qu'à un
approfondissement naturel.
Ça aurait donc plus, à mon humble avis, sa place dans un billet sur un blog (vous avez un CMS, pourquoi ne pas en
profiter pour poster de petits billets pour "apprendre au-delà" aux lecteurs avides (si vous laissez courir la rumeur
que la lecture du blog augmente les chances au concours, succès garanti) ?), que dans une correction d'exercice, qui se
veut conclusive et relativement universelle (il faut que tout le monde la lise), donc si possible claire et concise
(quitte à ouvrir des portes, ou des liens, vers des sujets plus avancés).
Encore une fois, cette partie sur Valgrind n'est pas ce que je critique : moi, je l'aurais mise autre part, et comme
j'ai décidé d'écrire un message au sujet de cette correction dans son ensemble j'ai décidé d'en dire deux mots au
passage, mais je ne lui en veux pas.
> Concernant le deuxième point, notre solution est toujours
> asymptotiquement meilleure que celle d'utiliser la chaine brute,
> par un facteur multiplicatif.
Tu le sais certainement aussi bien que moi, l'étude théorique classique de la complexité *néglige* les facteurs
multiplicatifs. Tu as tout à fait le droit de faire des analyses plus fines (même si, comme je l'ai dit plus haut, il ne
faudrait pas non plus transformer une correction en une expérimentation), le problème c'est qu'ici elles ne me semblent
pas tellement pertinente :
- comme le montre l'expérimentation, le gain observé n'est pas du tout un facteur 16, ou 32 en 64 bits, même
asymptotiquement. Les opérations utilisées changent, leurs performances aussi (d'un facteur multiplicatif) et ton
analyse est donc bancale sans un modèle précis des performances de ton processeur, non portable et irréaliste avec les
machines d'aujourd'hui
- si tu utilisais un tableau d'entier, l'intérêt de la méthode décrite serait encore plus faible qu'avec le cas
particulier actuel où un seul entier suffit (c'est l'exploitation à outrance de ce cas particulier que je critique
principalement); je me permets même de conjecturer qu'elle serait plus lente que l'utilisation d'une structure de donnée
bien pensée (comme une queue), puisque tu n'aurais plus accès à l'opération "shift" qui en fait tout son intérêt
- comme le montre la suite de la discussion, les effets de localités jouent essentiellement autant que cette méthode de
stockage¹; faire une analyse formelle (qui se veut générale) à une échelle où les effets bas niveau (spécifiques à un
cas particulier) jouent autant me semble périlleux, et certainement pas une bonne pratique à enseigner aux débutants.
¹ : je reconnais que ces effets de localités sont probablement rendus exploitables par la compacité de la représentation
mémoire, et que donc sans cette "astuce" que je décrie ils perdraient tout leur sens. Ça n'enlève rien à mon propos, qui
est de dire que ces deux considérations sont de même nature.
> Les "astuces" sur les bits d'un entiers sont justement très utilisées
> dans beaucoup d'implémentations d'algorithmes et de structures de
> données dans des logiciels programmés par des gens qui savent en
> général ce qu'ils font.
Pourquoi ne pas réutiliser ces structures de données merveilleuses ? La STL propose une classe bit_vector, et la
plupart des compilateurs spécialisent vector pour profiter de la représentation mémoire compacte².
Réutiliser une structure de donnée déjà existante est certainement une bonne pratique que nous pouvons conseiller aux
débutants les yeux fermés. Jouer à l'apprenti sorcier en imitant les "gens qui savent ce qu'ils font" est plus
contestable.
² : mais pas de l'opérateur "shift", et vu les performances médiocres des manipulations en accès arbitraire sur des bits
isolés avec le software/hardware actuel ça ne serait pas forcément si formidable. Encore une fois on se heurte au
problème déjà mentionné : la valeur numérique précise de L rend l'astuce intéressante, mais elle ne peut pas évoluer ou
s'adapter à des paramètres différents.
> Enfin, comme tu as commencé à le dire, Prologin est un concours
> d'informatique, et non exclusivement d'algorithmique.
Je pense que, de nos jours, des connaissances de base en ingénérie logicielle sont plus utiles aux gens qui
s'intéressent à "l'informatique" que des astuces pour coder des chaînes de taille inférieure à 15. La correction
proposée va à l'encontre de ces principes (de bon sens : si une modification de 20% d'un de tes paramètre fait foirer
tout ton algorithme et nécessite un recodage quasi-complet, il y a comme un problème), et c'est ce que je lui reproche :
considérer cette possibilité dans une discussion entre personnes informées est peut-être une bonne idée, exposer cette
méthode comme une solution géniale à une bande de débutants impressionnables ne l'est clairement pas.
Une petite citation de Dijkstra :
« we have to be very careful in the choice of what we learn and teach, for unlearning is not really possible »