Bonjour, bienvenue dans cet épisode 8 sur les algorithmes de recherche et de tri de données, inséparable de cet autre sujet : les structures de données.
Pour moi, une grande partie du travail de codeur (mais pas que de codeurs), surtout débutant (mais pas que), c’est de rentrer des informations, puis chercher des informations.
Il y a beaucoup à dire, j’ai écrit de quoi faire deux épisodes, il y en aura sûrement un troisième dans les mêmes lignes plus tard.
Ranger et chercher
Les deux sont très liés : jeter tous vos livres n’importe où est une méthode de rangement incroyablement rapide, mais la recherche est incroyablement inefficace.
Ranger tous vos livres par titre demande du travail, mais revenir chercher un livre par la suite est très rapide, si on se rappelle du titre bien sûr.
Autre avantage : si vous n’avez pas le livre, vous voyez qu’il manque là où l’ordre alphabétique l’aurait placé : inutile de le chercher ailleurs, vous savez que vous ne le possédez pas ou l’avez prêté en ce moment.
L’alternative, sans rangement, aurait été de regarder chacun de vos livres, et de vous rendre compte tout à la fin que vous ne l’avez pas. C’est très inefficace et frustrant.
C’est pour cela que chacune des méthodes n’est pas objectivement meilleure ou moins bonne, mais les papiers scientifiques sur les structures de données ou algos de tri vont chercher à les évaluer en terme de meilleur cas, pire cas, et cas moyen.
Explorer le problème
Un léger problème toutefois, une série de plusieurs tomes a rarement des titres en ordre alphabétique, et vous devrez donc éparpiller la série dans votre bibliothèque.
Nouveau problème, nouvelle solution. On tente un truc un peu plus malin : trier par nom d’auteur.
C’est un avantage intéressant dont se servent les librairies et les bibliothèques : ranger par auteur permet souvent d’avoir des livres côte à côte qui soient probablement intéressants pour l’acheteur ou le lecteur, ne serait-ce que par thème proche ou pour ranger une série ensemble.
Chaque auteur écrit plusieurs livres, enfin on l’espère pour eux. Il faut donc un autre critère déterminant pour classer entre eux les livres de l’auteur : alphabétique ou date casserait là aussi des séries (pour les auteurs qui écrivent plusieurs séries en parallèle), à vous de voir.
Au pire, on vous force à reparcourir la section des livres d’un auteur du début à la fin pour savoir si le magasin possède bien tel ou tel exemplaire. On a perdu le côté immédiat et infaillible de l’ordre alphabétique pur, mais on a gagné quand même puisqu’on a restreint cette phase pénible à la section d’un auteur.
Sur les milliers d’ouvrages de la librairie, vous y gagnez : imaginez la longueur de la section de livres qui commencent par “Histoire de/des/de la” ou “Méthode de/des/pour” par exemple.
Eh oui : la nature de vos données va donc aussi influer sur le choix de la structure de données à choisir !
Attention toutefois : il faudra trouver une astuce quand il y a plusieurs auteurs…
La structure et le besoin
On vient de faire un arbitrage entre la complexité de rangement à chaque fois qu’on ajoute ou remet un livre dans les étagères, contre un énorme avantage à la recherche. Si votre problème est rarement d’ajouter ou ranger des éléments, et plus souvent de rechercher, c’est un coût qu’il est intéressant de payer.
Mais quand vous faites des logs dans votre application, vous listez tout ce qui se passe pour, peut-être, y chercher des informations un jour. On peut alors légitimement choisir l’arbitrage inverse.
Par exemple, les journaux sont un produit radicalement différent d’un livre : ils contiennent des informations variées d’auteurs variés, et une bonne partie de ce qu’ils contiennent n’est plus aussi intéressant au bout d’une semaine, un mois, deux ans… Le rangement de journaux par date semble être le plus sensé, et empiler vos journaux les uns au-dessus des autres une méthode tout à fait acceptable.
Conclusion
Bref, ranger et rechercher : l’un impose des contraintes à l’autre, et vice-versa. Même chose pour la paire structure de données et traitements : vous rendrez certaines choses possibles ou impossibles, tout en en rendant d’autres plus simples ou plus compliquées.
C’est pour cela qu’en général aucun code ou aucun algo n’est mieux qu’un autre, ils sont simplement plus ou moins adaptés, et la clé est de connaître à la fois la nature des données, les opérations que l’on veut faire le plus souvent, le moins souvent, et des ordres de grandeur pour chaque.
Pourquoi cet épisode ?
C’est un sujet beaucoup enseigné en écoles et dans les livres de programmation, on a du mal à voir le but, et ça en bloque plus d’un. Heureusement, il y a des chances que vous déléguiez tout ce travail à la base de données, qui fait cela très bien. Pas d’inquiétude.
Mais pour les rares fois où c’est votre job de choisir la base de données la plus adaptée, et pour les cas très fréquents où vous seriez tentés d’écrire des lignes de code très simples mais qui refont en moins bien le travail que la base de données aurait pu faire, ça me semble important voire nécessaire de comprendre ce qu’il y a en dessous.