Tableau de tri de 5 entiers avec un maximum de 7 compares


19

Comment puis-je trier une liste de 5 entiers de telle sorte que dans le pire des cas, il faut 7 comparaisons? Je me fiche du nombre d'autres opérations qui sont effectuées. Je ne sais rien de particulier sur les entiers.

J'ai essayé différentes approches de division et de conquête qui me ramènent à 8 comparaisons, comme suivre une approche mergesort ou combiner mergesort avec l'utilisation de la recherche binaire pour trouver la position d'insertion, mais chaque fois que je me retrouve avec 8 compare le pire des cas .

En ce moment, je cherche juste un indice, pas une solution.


Avez-vous essayé d'écrire l'arborescence "comparer à"? Il en a feuilles, chacune correspondant à une permutation des entiers. Si vous ne savez pas ce que j'entends par l'arborescence "comparer", connaissez-vous la preuve que vous avez besoin de n log n comparaisons? Ps, qu'est-ce qui vous fait penser que c'est possible? 5!=120nlogn
Pål GD

1
Eh bien, en complément de 8 bits deux, if(x > y)c'est la même chose que if((x - y) & 0x80)ce qui n'est guère comparable. Je suppose que nous devons oublier que les objets sont des entiers et supposer que nous devons utiliser une compare(x, y)fonction magique pour comparer ces objets ...
Karolis Juodelė

2
Est-ce que «consultez la section 5.3 sur le tri optimal dans le volume 3 de The Art Of Computer Programming , qui couvre précisément cette question» constitue-t-elle un indice ou une solution? :-)
Steven Stadnicki

3
La borne est vraiment que et 5 ! = 120 < 2 7 = 128 . Ainsi , il est possible (en principe). 2cn!5!=120<27=128
vonbrand

Réponses:


23

Il n'y a qu'une seule façon de démarrer ce processus (et pour presque toutes vos décisions sur ce qu'il faut comparer dans les étapes ultérieures, il n'y en a qu'une seule correcte). Voici comment le comprendre. Tout d'abord, notez qu'il y a réponses possibles que vous pouvez obtenir pour vos comparaisons, et 5 ! = 120 permutations différentes dont vous devez faire la distinction.27=1285!=120

La première comparaison est facile: vous devez comparer deux clés, et comme vous ne savez rien à leur sujet, tous les choix sont également bons. Supposons donc que vous compariez et b et que vous trouviez a b . Il vous reste maintenant 2 6 = 64 réponses possibles, et 60 permutations possibles restantes (puisque nous en avons éliminé la moitié).abab26=6460

Ensuite, nous pouvons soit comparer et d , soit comparer c à l'une des clés que nous avons utilisées dans la première comparaison. Si nous comparons c et d , et apprenons que c cdccd , alors nous avons 32 réponses restantes et 30 permutations possibles. D'autre part, sion compare c avec un , et nous découvrons que a c , nous avons 40 permutations possibles restantes, parce que nous avons éliminé 1 / 3 des permutations possibles (ceux avec c cd3230caac401/3 ). Nous n'avons que 32 réponses possibles, nous n'avons donc pas de chance.cab32

Alors maintenant, nous savons que nous devons comparer les première et deuxième clés et les troisième et quatrième clés. Nous pouvons supposer que nous avons et c dabcd . Si l' on compare à l' une de ces quatre touches, par le même argument que nous avons utilisé à l'étape précédente, on peut seulement éliminer 1 / 3 des permutations restantes, et nous sommes hors de la chance. Nous devons donc comparer deux des clés a , b , c , d . En tenant compte de la symétrie, nous avons deux choix, comparer a et c ou comparer a et de1/3a,b,c,dacad. Un argument de comptage similaire montre que nous devons comparer et c . On peut supposer sans perte de généralité que a c , et maintenant on a a b et a c d .acacabacd

Puisque vous avez demandé un indice, je ne passerai pas en revue le reste de l'argument. Il vous reste quatre comparaisons. Utilisez-les judicieusement.


Comment avez-vous obtenu que la comparaison de à c ne vous ramène qu'à 40 permutations? ac
Robert

1
@Robert: Supposons que vous ayez et a c . Il y a alors deux permutations de a , b , c cohérentes avec ces contraintes, a < b < c et a < c < b . Pour chacune de ces deux permutations, il y a quatre emplacements que vous pouvez ajouter d et cinq emplacements que vous pouvez ajouter e . abaca,b,ca<b<ca<c<bde
Peter Shor

8

Vous pouvez le trouver dans The Art of Computer Programming vol III, par D.Knuth, mais la stratégie est la suivante (je suppose que vous avez un tableau ): Si vous voulez lire un indice juste les deux premières lignes de ma réponse{a,b,c,d,e}

  • Premier groupe de paires de nombres: .(a,b),(c,d)
  • Comparez les paires pour les trier, par exemple: .a<b,c<d
  • Comparez les plus petits éléments des paires, nous obtenons un résultat par exemple .a<c
  • Comparez le dernier élément , avec le plus grand élément dans la dernière comparaison ( c ) ec
    • Si , est facile de se retrouver avec 3 comparaison restante. Fini.e<c
    • Si vous devez trier { b , c , d , e } avec la connaissance c < e , c < d . e>c{b,c,d,e}c<e,c<d
      • , si d < e alors Compare(d,e)d<e
        • , si b > dCompare(b,d)b>d
          • . Fini.Compare(b,e)
        • si b<d
          • . Fini.Compare(b,c)
      • si d>e
        • si b > eCompare(b,e)b>e
          • . Fini.Compare(b,d)
        • si b<e
          • . Fini.Compare(b,c)

Tous les moyens mentionnés ci-dessus sont à l'origine d'au plus trois comparaisons après la première comparaison de avec c . (signifie 7 au maximum). ec


Etes-vous sûr que c'est correct? Supposons que vous obteniez les résultats suivants: a <b, c <d, a <c puis c <e, b <e, c <b et d <e. Les ordres a <c <b <d <e et a <c <d <b <e sont tous les deux cohérents avec eux. La raison en est que b et d ne sont jamais comparés, implicitement ou explicitement. Peut-être que je me trompe quelque part, si c'est le cas, corrigez-moi.
George
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.