J'ai quelques objets avec priorité qui sont de type composé et qui ne sont que partiellement ordonnés . Je dois sélectionner les objets dans l'ordre de cette priorité (c.-à-d. Produire un élément minimal à chaque fois). Mais plutôt que de terminer arbitrairement la commande, je préférerais que la file d'attente soit stable en ce sens que s'il y a plus d'un élément minimal, il devrait renvoyer le plus ancien en premier.
Existe-t-il une structure de données de tas qui fonctionnerait avec un ordre partiel? Ou une modification de la file d'attente prioritaire régulière pour fonctionner avec elle? Le choix commun pour l'algorithme dont j'ai besoin est un tas binaire simple ou 4-aires, mais cela ne fonctionne pas avec un ordre partiel.
Les valeurs de priorité prennent en charge:
- partiel à l'aide de l'opération . Il s'agit d'un ordre partiel, il est donc possible que a \ preccurlyeq b soit faux et b \ preccurlyeq a soit également faux. J'écris un \ not \ lesseqgtr b dans ce cas.a ≼ ba ⋚ ̸ b
- Trouver infima (glb) et suprema (lub). est le y maximal tel que . Le calcul de l'infimum de valeurs prend du temps . Infimum (et supremum) de chaque ensemble existe.
- Une extension linéaire pour l'ordre partiel pourrait être définie. L'utiliser pour la file d'attente prioritaire est la solution la plus simple car l'algorithme fonctionne de cette façon. Mais l'ordre affecte les performances et l'ordre d'insertion semble être le meilleur pour éviter les pires cas.
De plus, l'algorithme dans lequel je veux l'utiliser doit connaître l'infimum de toutes les priorités dans la file d'attente.
Les priorités ont une signification concrète, mais sont sujettes à changement, il ne semble donc pas viable de s'appuyer sur d'autres propriétés qu'elles pourraient avoir.
Remarque: les tas binaires ne fonctionnent pas avec un ordre partiel. Supposons un tas binaire avec , et , où et et . Ils sont positionnés dans cet ordre, donc
a (0)
/ \
b (1) c (2)
maintenant d est inséré. La prochaine position libre est 3, l'enfant gauche de , donc nous obtenons
a (0)
/ \
b (1) c (2)
/
d (3)
Si (ce qui implique de transitivité, mais ne dit rien sur et ) et , alors n'est pas échangé avec , car ce n'est pas moins. Mais il est en fait inférieur à , mais il n'est pas comparé à lui, donc maintenant l'invariant du tas principal ne tient pas; le sommet n'est pas minimal.d ≼ c d b d ⋚ ̸ b d b
Je soupçonne qu'une forêt de tas quelque peu dans le style d'un tas binomial pourrait être mise en place. Fondamentalement, il est important de toujours comparer les nouvelles valeurs avec root et de ne lier que des éléments comparables. Cela rendrait les arbres de la forêt de taille aléatoire et rendrait ainsi la complexité dépendante du nombre d'ensembles mutuellement incomparables dans le tas. Je soupçonne quelque peu que la complexité ne peut pas être corrigée (nous devons continuer à comparer jusqu'à ce que nous atteignions un élément comparable) J'ai peut-être manqué quelque chose, alors je laisse cela ouvert.
Remarque: l'ordre est partiel et bien qu'il existe des moyens de lui définir des extensions linéaires, l'ajout d'un horodatage et son utilisation comme critère secondaire n'en fait pas partie. Supposons que nous ayons affecté l'horodatage pour chaque et défini l'ordre comme ssi ou ( et . Supposons alors que nous ayons , , distincts , tels que et . Alors eta ≼ ′ a ≼ ′ b a ≼ b b ⋠ a t ( a ) ≤ t ( b ) a b c t ( a ) ≤ t ( b ) ≤ t ( c ) c ≤ a a ≼ ′ b b ≼ ′ c c ≼ ′ a , mais , donc la relation n'est pas transitive et n'est donc pas du tout un ordre. Ce type d'extension ne fonctionne que pour les commandes faibles, mais pas partielles.
Edit: je me suis rendu compte que non seulement l'infimum d'un ensemble était défini, mais que je devais en fait pouvoir obtenir efficacement l'infimum des éléments actuellement dans la file d'attente. Donc, je me demande maintenant si l'ajout de nœuds spéciaux contenant des infima de sous-arbres à une structure de tas commune serait utile.