Bonjour les agrumes !
La bêta a été mise à jour et décante sa pulpe
à l’adresse suivante :
Merci d’avance pour vos commentaires.
Merci Quentin pour les remarques ! Je suis content que ce sujet plaise enfin à quelqu’un
Je comprends l’élégance du modèle cache-oblivious, et je vois pourquoi les algorithmes optimaux changent avec ce nouveau modèle. Mais en pratique, on va quand même utiliser les algorithmes optimaux pour EM, non ?
La question est difficile. L’avantage du modèle cache-oblivious est qu’il s’affranchit complètement des paramètres, l’algorithme devient donc optimal par rapport à n’importe quelle configuration. Cela permet de supprimer les problèmes qui émergent avec des hiérarchies de caches d’un seul tenant puisqu’on sait que la situation est optimale entre chaque paire.
En pratique, on connaît (ou tout du moins, on a des bonnes idées sur) la configuration sur laquelle on va faire tourner l’algorithme. On peut donc mieux tuner les paramètres et battre les cache-oblivious. Il y a d’ailleurs un article sur le coût de la cache-obliviousness qui essaye de quantifier le gain d’information théorique que l’on a lorsqu’on connaît les paramètres du problème a priori mais il est somme toute faible.
Mais le point principal est tout autre. Les algorithmes cache-oblivious sont des monstruosités à programmer alors que les EM sont nettement plus simples. Pour s’en convaincre, il suffit d’écrire un algorithme qui fusionne un nombre arbitraire de listes triées, on se confronte très vite à un mur. En EM, on est capable de fixer les variables et cela simplifie énormément l’algorithme.
Cette complexité algorithmique aura tendance à se traduire par une lenteur de l’algorithme dans les modèles temporels. Et ce qui intéresse les gens est essentiellement le temps d’exécution. La situation est d’ailleurs très claire avec le "list ranking problem", en complexité temporelle, on a un bête algorithme (il suffit de parcourir la liste) en O(n) (thèse de Wyllie, inventeur du modèle PRAM). Alors que si on tente de le rendre optimal en EM, la complexité temporelle passe à un O(n log n).
Donc en résumé, ça dépend des situations et on benchmark =)
Ou alors il peut y avoir des cas où on veut écrire des programmes qui utilisent des B-trees binaires ou dynamiques ?
En petite aparté, Les B-trees peuvent être vus comme des généralisations des arbres binaires, l’expression "B-trees binaires" me choque =)
Là où c’est fabuleux, c’est quand les deux mondes (l’I/O et le temporel) se rencontrent. On arrive à un critère d’optimalité très fort. Le meilleur exemple sont les B-trees. On est en ΘEM(logBN) et ΘRAM(logBN). Seulement Θ(logBN)=Θ(logN) à une constante près. Or, les BST ont la même complexité temporelle mais on se rend compte que les red-black trees sont en réalité en Θ(log2N) et les AVL en Θ(log1.4N), là où les B-trees sont pratiquement en Θ(logBN) (si je me souviens bien). Mais, en pratique, les B-trees explosent complètement les performances des BST par le fait qu’ils exploitent le cache et minimisent le nombre de cache-miss.
La différence entre les B-trees statiques ou dynamiques résident dans la disposition en mémoire des éléments. Ceux statiques exploitent le van Embde Boas layout alors que les dynamiques sont plus proches de ceux qu’on aurait tendance à écrire naturellement. Et, en pratique, cette différence est marginale et ceux dynamiques sont mieux puisqu’ils offrent plus de fonctionnalités.
En résumé, il n’y a jamais de réponse absolue. D’un point de vue théorique, on va toujours préférer la solution la plus générale et la plus optimale. Et en pratique, on va devoir mesurer et tester différentes méthodes afin de trouver la meilleure à notre cas particulier.