La transitivité est-elle requise pour un algorithme de tri

14

Est-il possible d'utiliser un algorithme de tri avec une comparaison non transitive, et si oui, pourquoi la transitivité est-elle répertoriée comme exigence pour le tri des comparateurs?

Contexte:

  • Un algorithme de tri trie généralement les éléments d'une liste selon une fonction de comparaison C (x, y), avec

    C(X,y)={-1si Xy0si Xy+1si Xy

    Les exigences pour ce comparateur sont, pour autant que je les comprenne:

    • réflexif: X:C(X,X)=0
    • antisymétrique: X,y:C(X,y)=-C(y,X)
    • transitive: X,y,z,une:C(X,y)=uneC(y,z)=uneC(X,z)=une
    • C (x, y) est défini pour tous les x et y, et les résultats dépendent uniquement de x et y

    (Ces exigences sont toujours répertoriées différemment selon les différentes implémentations, donc je ne suis pas sûr de les avoir bien comprises)

Maintenant, je me pose des questions sur une fonction de comparaison "tolérante", qui accepte les nombres x, y comme similaires si : C ( x , y ) = { - 1 si x < y - 1 0 si|X-y|1

C(X,y)={-1si X<y-10si |X-y|1+1si X>y+1

Exemples: les deux [ 1, 2, 3, 4, 5]et [1, 4, 3, 2, 5]sont correctement triés par ordre croissant selon le comparateur tolérant ( C(X,y)0 si x vient avant y dans la liste)
mais [1, 4, 2, 3, 5]ne l'est pas, puisque C (4,2) = 1

Ce comparateur tolérant est réflexif et antisymétrique, mais pas transitif.

c'est-à-dire C (1,2) = 0, c (2,3) = 0, mais C (1,3) = -1, violant la transitivité

Pourtant, je ne peux penser à aucun algorithme de tri qui ne parviendrait pas à produire une sortie "correctement triée" si l'on donnait ce comparateur et une liste aléatoire.

La transitivité n'est-elle donc pas requise dans ce cas? Et est - il une version moins stricte de transitivité qui est nécessaire pour le tri au travail?

Questions connexes:

HugoRune
la source
Je pense que le tri rapide avec "toujours choisir le milieu" pour le pivot échouerait en utilisant ce comparateur sur [3, 2, 1].
G. Bach
2
Je soupçonne qu'un certain comparateur non transitif utilisé dans un algorithme de tri pourrait provoquer une boucle infinie.
Karolis Juodelė
1
Que considéreriez-vous comme une liste triée (c'est-à-dire la sortie requise)? Dans le cas habituel, il y a deux conditions équivalentes: , et pour tout . a ia j i junejeuneje+1unejeunejjej
Yuval Filmus
@ G.Bach Je pense que le tri rapide échouera complètement si votre tableau a n fois 3, une fois 2, n fois 1 et que le milieu 2 est utilisé comme premier pivot, quoi qu'il arrive par la suite.
gnasher729

Réponses:

11

Vous avez demandé: pouvons-nous exécuter un algorithme de tri, en lui fournissant un comparateur non transitif?

La réponse: bien sûr. Vous pouvez exécuter n'importe quel algorithme avec n'importe quelle entrée.

Cependant, vous connaissez la règle: Garbage In, Garbage Out. Si vous exécutez un algorithme de tri avec un comparateur non transitif, vous pouvez obtenir une sortie non-sens. En particulier, rien ne garantit que la sortie sera "triée" en fonction de votre comparateur. Ainsi, l'exécution d'un algorithme de tri avec un comparateur non transitif ne sera probablement pas utile de la manière que vous espériez probablement.

À titre de contre-exemple, l'exécution du tri par insertion sur la liste d'entrée aide de votre comparateur laisserait la liste inchangée - mais la liste de sortie résultante n'est pas dans l'ordre trié (selon votre comparateur).[3,2,1]

DW
la source
1
ma première pensée a été que la liste [3,2,1] est triée selon mon comparateur, donc bien sûr, le tri devrait rester inchangé; mais j'ai peut-être utilisé la mauvaise définition de tri. Je compare simplement chaque élément à ses voisins directs, mais cela pourrait être une restriction trop faible pour envisager une liste triée
HugoRune
4
@HugoRune Eh bien, c'est un point intéressant. Que voulez - vous dire par trié ? Si vous pouvez montrer qu'un algorithme de tri se terminera avec un comparateur non transitif, et que chaque fois que l'algorithme se termine, une condition est vraie, et cette condition est ce que vous considérez comme le tri ... alors bien sûr, cet algorithme triera votre liste à chaque fois, pour cette définition du tri . Si le comparateur n'est pas transitif, il peut ne pas être judicieux de prendre une définition de tri qui nécessite une comparaison par paire de tous les éléments de la liste triée.
Patrick87
3
@HugoRune, avec "seuls les voisins sont comparés", vous aurez probablement besoin d'un tri personnalisé. Les algorithmes standard supposent une transitivité pour éviter les comparaisons redondantes. Ou vous pouvez intégrer votre ordre non transitif dans un ordre transitif. Ou peut-être cherchez-vous quelque chose dans le sens du tri topologique ?
vonbrand
Je suis tombé sur cela il y a un certain temps et j'ai trouvé que le tri à bulles fonctionne vraiment bien, car il ne compare que les éléments adjacents.
Mooing Duck
4

Étant donné un ensemble d'éléments et une relation d'ordre binaire, la transitivité est nécessaire pour ordonner totalement les éléments. En fait, la transitivité est même nécessaire pour définir un ordre partiel sur les éléments. http://en.m.wikipedia.org/wiki/Total_order

Vous auriez besoin d'une définition beaucoup plus large de ce que signifie "trié" afin de trier les éléments sans transitivité. Il est difficile d'être autonome. Une autre réponse dit "En particulier, il n'y a aucune garantie que la sortie sera" triée "selon votre comparateur." Mais nous pouvons en fait dire quelque chose de beaucoup plus fort. Vous avez la garantie que la sortie n'est pas triée en fonction de votre comparateur.

Supposons que vous disposez d'un comparateur non transitif qui vous indique , et . Quel élément est le plus petit? Peu importe celui que vous choisissez, votre comparateur vous dira qu'un autre élément est plus petit.une<bb<cc<une

Joe
la source
1
J'ai interprété la question de se poser sur le tri à l'aide d'ordonnances partielles (de sorte que les comparaisons qui disent que les choses sont inégales sont transitives, mais celles qui considèrent les articles sont indiscernables ne le sont pas). Le tri basé sur un ordre partiel est parfois utile, mais dans le pire des cas nécessite des comparaisons N (N-1) / 2. Tout algorithme de tri qui, dans le pire des cas, fait moins que N (N-1) / 2 comparaisons ne pourra pas classer correctement les articles partiellement ordonnés pour les raisons décrites dans ma réponse.
supercat
2

Il semble que ce que vous voulez, c'est organiser les éléments de sorte que tous les classements discernables soient corrects, mais les éléments qui sont proches peuvent être considérés comme "indiscernables". Il est possible de concevoir des algorithmes de tri qui fonctionneront avec de telles comparaisons, mais à moins qu'il n'y ait des limites au nombre de comparaisons pouvant signaler que les choses sont indiscernables, il n'y a aucun moyen de les éviter d'avoir besoin de comparaisons N (N-1) / 2. Pour comprendre pourquoi, choisissez un nombre N et tout algorithme de tri qui fait moins de N (N-1) / 2 comparaisons. Remplissez ensuite une liste L [0..N-1], définissez chaque élément L [I] sur I / N et "triez" ce dernier à l'aide de votre comparateur (la valeur minimale sera 0 et la valeur maximale (N-1) / N , la différence sera donc (N-1) / N, qui est inférieure à 1).

Puisqu'il y a N (N-1) / 2 paires d'articles qui peuvent être comparées, et que le tri n'a pas fait autant de comparaisons, il doit y avoir une paire d'articles qui n'a pas été directement comparée les unes aux autres. Remplacez celui qui a fini par être trié d'abord par 1, et l'autre par -1 / N, ramenez tous les éléments à leur position initiale et répétez l'opération de tri. Chaque opération de comparaison unique donnera zéro, tout comme elle l'a fait la première fois, de sorte que les mêmes comparaisons seront effectuées et les éléments se retrouveront dans la même séquence. Pour que la liste soit correctement triée, le "1" devrait trier après le "-1 / N" (car ils diffèrent de plus d'un), mais puisque l'algorithme de tri ne comparerait jamais ces deux éléments directement l'un avec l'autre, il n'aurait aucun moyen de le savoir.

supercat
la source
0

Remplissez un tableau de n éléments avec les valeurs n, n-1, n-2, ..., 2, 1. Ensuite, essayez de trier en utilisant l'algorithme "d'insertion directe". Vous constaterez que chaque élément est considéré comme égal à l'élément juste avant lui et qu'il n'est donc pas déplacé. Le résultat du "tri" est le même tableau.

gnasher729
la source