Curiosité des ordres de traversée PriorityQueue
La classe Java PriorityQueue propose un itérateur intégré qui, étonnamment, ne garantit pas la traversée dans un domaine particulier commande. Cet écart par rapport à la norme soulève la question : pourquoi l'itérateur PriorityQueue se comporte-t-il de cette façon ?
En fouillant dans la documentation Java, nous rencontrons le passage suivant :
"Cette classe et son itérateur implémentent tout des méthodes facultatives des interfaces Collection et Iterator. L'Iterator fourni dans la méthode iterator() n'est pas garanti pour parcourir les éléments de la file d'attente prioritaire dans un ordre particulier si vous en avez besoin. traversée, pensez à utiliser Arrays.sort(pq.toArray())."
La raison sous-jacente réside dans la structure de données utilisée par PriorityQueue. Contrairement aux structures de données telles que les tableaux ou les listes chaînées, PriorityQueue utilise un tas binaire, qui donne la priorité à la récupération de l'élément le plus petit ou le plus grand. Cette priorisation a cependant un coût. En raison de la nature du tas, il n'existe pas d'algorithme efficace pour fournir un parcours ordonné de ses éléments.
Dans un tas binaire, le plus petit élément réside à la racine, et lorsqu'il est supprimé, le tas est rééquilibré pour élever le plus petit élément suivant à la racine. Cette réorganisation constante rend le parcours ordonné peu pratique.
Par conséquent, l'itérateur PriorityQueue est conçu pour parcourir la structure de données sans offrir aucune garantie sur la séquence dans laquelle les éléments sont renvoyés. Pour un parcours ordonné, des méthodes externes telles que Arrays.sort() doivent être utilisées sur une représentation matricielle de PriorityQueue.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!