Tri à l'aide d'une boîte noire


20

Supposons que nous voulons trier une liste de n nombres réels. Supposons que l'on nous donne une boîte noire qui peut trier Sn nombres réels instantanément. Quel avantage pouvons-nous gagner en utilisant cette boîte noire?n

Par exemple, pouvons-nous trier les nombres avec seulement appels à la boîte noire? Le meilleur algorithme que j'ai trouvé utilisenappels à la boîte noire. Mais je n'ai pas pu l'améliorer davantage. Voici mon algorithme qui est similaire au tri par fusion:O(n)n

Première partition de la liste en S listess1,s2,. . . ,sn avec environs1,s2,...,sntaille n . Utilisez ensuiten appelle la boîte noire pour trier ces listes. Enfin, fusionnez les listes triées à l'aide de la boîte noire comme suit:n

Mettez les plus petits éléments des listes dans une nouvelle liste , puis appelez la boîte noire pour la trier. Le nombre de L [ 1 ] (premier et plus petit élément de L ) sera le plus petit nombre dans S . Nous pouvons le mettre à la première place de la liste de sortie. En supposant que l'élément a été choisi parmi les s j , on remplace L [ 1 ] avec le deuxième plus petit élément de la liste de tri de j , et d' exécuter à nouveau la boîte noire sur elle pour calculer le deuxième plus petit élément de S .LL[1]LS
sjL[1]sjS
Nous continuons jusqu'à ce que tous les éléments soient triés. Le nombre total d'appels en boîte noire pour cette partie sera . Par conséquent, dans l'ensemble, le nombre total d'appels seran.nnn

D'un autre côté, il semble que nous devrions pouvoir obtenir une borne inférieure en utilisant la borne inférieure sur les comparaisons de nombres nécessaires pour le tri comme suit: Nous pouvons implémenter la boîte noire en utilisant comparaisons. Si nous pouvons résoudre le problème aveco(nlgn=12nlgnappels à la boîte noire et en fusionnant en temps linéaire on peut triernnombres réels avec descomparaisonso(nlgn)ce qui est impossible.o(n)no(nlgn)

Je suppose que nous pourrions prouver que est une limite inférieure pour le nombre d'appels à la boîte noire, car de nombreuses comparaisons utilisant dans la boîte noire seraient partagées et sont donc racontées dans notre argument.Ω(n)

MISE À JOUR: Comme le suggèrent les autres articles, un est également réalisable.nlgn


2
Il semble y avoir une faute de frappe dans votre commentaire. Vouliez-vous dire: "pas d'algorithme utilisant moins de appels vers la machine peuvent trierNnombres réels avec moins deNlgNcomparaisons "? Ps: vous devez également faire attention au fait que lalimite inférieureNlgNne s'applique qu'aux algorithmes de tri basés sur la comparaison.NNNlgNNlgN
Kaveh

8
Je pense que nous pouvons même obtenir utilisant le réseau de tri d'AKS. Leur réseau peut être considéré comme une instanciation de votre modèle où la boîte noire peut trier des blocs de taille 2. Leurs algorithmes utilisent desrondesO(logn), chaque ronde appelant le 2-trieurO(n)fois. Une "série" detrieursO(n)2 peut être facilement simulée avecO(O(nlogn)O(logn)O(n)O(n)O(n) trieurs. n
Vinayak Pathak

6
@VinayakPathak: Divisez les données d'entrée en morceaux de taille2N, puis triez les morceaux à l'aide du réseau AKS, après avoir remplacé chaque comparateur par unN/2 trieur. N
Jeffε

1
@ Jɛ ff E: Oui, très bien, cela semble définitivement plus simple que ma construction.
Vinayak Pathak

1
@ Jɛ ff E, vos commentaires peuvent être une réponse. :)
Kaveh

Réponses:


15

Il est possible de trier avec appels à la boîte noire et aucune comparaison.O(nlogn)

Considérons d'abord le problème de partitionnement équilibré suivant: étant donné éléments A [ 1 .. m ] (où mA[1..m]), divisez-les en deux groupes, le plus petit de taille au moins environm/4, de sorte que tous les éléments du premier groupe soient plus petits que tous les éléments du deuxième groupe. Cela peut être fait avecO(m/nmnm/4appels à la boîte noire. (Je le décrirai plus tard.) Utilisez ensuite quicksort avec cet algorithme de partitionnement:O(m/n)

def qsort(A[1..m]):
   if m < sqrt(n): sort A with one call to the black box
   else:
     Partition A[1..m] into two groups as described above.
     Recursively qsort the first group.
     Recursively qsort the second group.

En supposant que chaque étape de partition prend appels à la boîte noire, l'algorithme ci-dessus, étant donné l'entréeA[1 ..n], feraO(O(m/n)A[1..n] appelle la boîte noire, car l'arbre de récursivité a la profondeur O ( log n ) et chaque niveau de l'arbre a un total de O ( n / O(nlogn)O(logn)appels à la boîte noire.O(n/n)=O(n)

Effectuez l'étape de partitionnement comme suit:

def partition(A[1..m]):  (where sqrt(n) <= m <= n)
   Divide A into m/sqrt(n) groups of size sqrt(n) each.
   Sort each group with one call to the black box per group.
   Sort the medians of the groups with one call to the black box.
   (Note the number of groups is less than sqrt(n), because m <= n.)
   Let X be the median of the medians.
   Partition all m elements around X, using the black box as follows:
      For each group G, let Y be its median:
        Call the black box once on (G - {Y}) union {X}.
        (This gives enough information to order all elts w.r.t. X.)

Dans la dernière étape de l'algorithme partition (): "Partitionner tous les m éléments autour de X", cela n'utilisera-t-il pas m comparaisons supplémentaires?
Vinayak Pathak

2
Voir la ligne juste après l'algorithme, il explique comment faire cette étape. Je vais le modifier pour que ce soit plus clair.
Neal Young

24

Je pense que votre question a été abordée dans l'article de Beigel et Gill " Tri d'objets n à l'aide de k-sorter " de 1990 et le résumé de l'article dit tout:

etnlognklogk4nlognklogk


Je vous remercie. Je n'ai pas pu trouver le papier. Pouvez-vous fournir le lien vers le document ou sa preuve?
AmeerJ


Aussi sur citeseerx .
Kaveh

8
Notez que lorsque k=nΘ(n)

12

O(nlogn)n

kn2(n/k)2k2n/k

BlockBubbleSort(X[0..n-1], k):
   m = floor(n/k)
   for i = 1 to m
      for j = 0 to m-1
          BlackBoxSort(X[j*k .. (j+1)*k-1])
      for j = 0 to m-1
          BlackBoxSort(X[j*k + k/2 .. (j+1)*k + k/2 - 1])

n=18k=4k

entrez la description de l'image ici

k/2k tri à la place d'une opération de comparaison-échange. La correction s'ensuit en observant que le réseau trie correctement tout tableau de 0 et de 1 .

O((n/k)2)O((n/k)log2(n/k))=O(nlog2n)O((n/k)log(n/k))=O(nlogn)


Ω(n lg(n))

2
O(n)

+1 pour cette jolie photo! Je peux me tromper mais il me semble que ce n'est pas tout à fait correct (corrigez-moi si je me trompe). En supposant que la sortie est dans l'ordre croissant, si le plus petit élément est dans la dernière position, il n'y a pas de "chemin" pour qu'il "se déplace" vers la première position. Changer "pour i = 1 à m" en "pour i = 1 à m + 1" semble corriger cela, bien qu'il puisse introduire des frais généraux inutiles.
George

@George Oups, vous avez raison; J'ai besoin d'une couche de plus!
Jeffε
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.