commande stl – commande faible ssortingcte

Pourquoi STL fonctionne-t-il avec une fonction de comparaison qui est un ordre faible ssortingct ? Pourquoi ne peut-il pas s’agir d’une commande partielle?

Un ordre partiel ne serait pas suffisant pour mettre en œuvre certains algorithmes, tels qu’un algorithme de sorting. Dans la mesure où un ensemble partiellement ordonné ne définit pas nécessairement une relation entre tous les éléments de l’ensemble, comment sortinger une liste de deux éléments sans relation d’ordre dans l’ordre partiel?

Simplement, un ordre faible ssortingct est défini comme un ordre qui définit une relation d’équivalence (calculable) . Les classes d’équivalence sont ordonnées par l’ordre faible ssortingct: un ordre faible ssortingct est un ordre ssortingct sur les classes d’équivalence .

Un ordre partiel (qui n’est pas un ordre faible ssortingct) ne définit pas une relation d’équivalence, donc toute spécification utilisant le concept d ‘”éléments équivalents” n’a pas de sens avec un ordre partiel qui n’est pas un ordre faible ssortingct. Tous les conteneurs associatifs de la STL utilisent ce concept à un moment donné, de sorte que toutes ces spécifications n’ont pas de sens avec un ordre partiel qui n’est pas un ordre faible ssortingct.

Etant donné qu’un ordre partiel (ce n’est pas un ordre faible ssortingct) ne définit pas nécessairement un ordre ssortingct, vous ne pouvez pas “sortinger les éléments” au sens commun selon un ordre partiel (vous ne pouvez faire qu’un “sorting topologique” qui a des propriétés plus faibles ).

Donné

  • un ensemble mathématique S
  • une commande partielle < sur S
  • une valeur x en S

vous pouvez définir une partition de S (chaque élément de S est soit dans L(x) , I(x) ou G(x) ):

 L(x) = { y in S | y 

Une séquence est sortingée selon < ssi pour chaque x de la séquence, les éléments de L(x) apparaissent en premier dans la séquence, suivis des éléments de I(x) , suivis des éléments de G(x) .

Une séquence est topologiquement sortingée ssf pour chaque élément y qui apparaît après un autre élément x de la séquence, y n’est pas inférieur à x . C'est une contrainte plus faible que d'être sortingée.

Il est sortingvial de prouver que chaque élément de L(x) est inférieur à tout élément de G(x) . Il n'y a pas de relation générale entre les éléments de L(x) et les éléments de I(x) , ni entre les éléments de I(x) et les éléments de G(x) . Cependant, si < est un ordre faible ssortingct, chaque élément de L(x) est inférieur à tout élément de I(x) et tout élément de I(x) est inférieur à tout élément de G(x) .

Si < est un ordre faible ssortingct et x alors tout élément de L(x) UI(x) est inférieur à tout élément I(y) UG(y) : tout élément non supérieur à x est inférieur à tout élément non moins que y . Cela ne vaut pas nécessairement pour une commande partielle.

Citant la réponse donnée ici :

Parce qu’en interne, ces algorithmes implémentent “est égal à” comme !(a < b) && !(b < a) .

Si vous avez utilisé <= pour implémenter l'opérateur inférieur à, alors ce qui précède renvoie false lorsque a == b . Un contrôle d'égalité brisé va bousiller presque n'importe quel algorithme.

De même, ils implémentent "n'est pas égal à" comme (a < b) || (b < a) (a < b) || (b < a) , et encore une fois, si vous avez implémenté l'opérateur < utilisant <= , il retournera true lorsqu'il sera égal à l'autre, alors qu'en réalité, il ne l'est pas. Donc, le contrôle d'égalité est brisé dans les deux sens.

Le but essentiel de la limitation de la bibliothèque à un opérateur inférieur à est que tous les opérateurs logiques peuvent être implémentés:

  • <(a, b) : (a < b)
  • <=(a, b) !(b < a)
  • ==(a, b) !(a < b) && !(b < a)
  • !=(a, b) : (a < b) || (b < a) (a < b) || (b < a)
  • >(a, b) : (b < a)
  • >=(a, b) !(a < b)

Cela fonctionne tant que votre opérateur fourni remplit les conditions d'une commande faible et ssortingcte. Les opérateurs standard <= et >= ne le font pas.

Vous ne pouvez pas effectuer de recherche binary avec un classement partiel. Vous ne pouvez pas créer d’arbre de recherche binary avec un ordre partiel. Quelles fonctions / types de données de l’ algorithme nécessitent une commande et peuvent travailler avec une commande partielle?

Vous pouvez le mettre en œuvre par exemple en combinant std :: multimap / multiset avec son propre prédicat, en remplaçant std :: less.