RĂ©seau de tri
En Informatique, un rĂ©seau de tri est un algorithme de tri qui trie un nombre fixe de valeurs en utilisant une suite fixe de comparateurs. On peut voir un rĂ©seau de tri comme un rĂ©seau composĂ© de fils et de comparateurs. Les valeurs, prises dans un ensemble ordonnĂ©, circulent le long des fils. Chaque comparateur connecte deux fils, compare les donnĂ©es qui entrent par les fils et les trie, sortant la plus petite donnĂ©e sur l'un des fils, la plus grande sur lâautre.
Les rĂ©seaux de tri diffĂšrent des algorithmes de tri par comparaison dans le sens oĂč ils ne sont pas capables de traiter un nombre arbitraire d'entrĂ©es ; de plus, leur sĂ©quence de comparaisons est dĂ©finie Ă l'avance, et indĂ©pendante du rĂ©sultat des comparaisons prĂ©cĂ©dentes. L'indĂ©pendance des sĂ©quences de comparaison est utile pour l'exĂ©cution en parallĂšle et pour la rĂ©alisation en hardware. Elle peut aussi ĂȘtre vue comme une protection contre un logiciel malveillant qui chercherait Ă examiner la nature des sĂ©quences triĂ©es.
Introduction
Un rĂ©seau de tri est constituĂ© de deux types d'objets : les fils et les comparateurs. Les fils transportent des donnĂ©es de gauche Ă droite, les valeurs transportĂ©es, une par fil, traversent le rĂ©seau toutes en mĂȘme temps et de façon synchrone. Chaque comparateur relie deux fils. Quand une paire de valeurs, transportĂ©e par une paire de fils, rencontre un comparateur, le comparateur Ă©change les valeurs si et seulement si la valeur sur le fil supĂ©rieur est plus grande que la valeur sur le fil infĂ©rieur ; de la sorte, Ă la sortie c'est toujours la plus petite valeur qui se trouve sur le fil supĂ©rieur et la plus grande sur le fil infĂ©rieur. Voir le mode opĂ©ratoire sur la figure ci-contre.
Formellement, si le fil supérieur contient x et le fil inférieur y, alors aprÚs avoir touché un comparateur les fils portent et respectivement, de sorte que la paire de valeur est triée[1]:p. 682. Un réseau composé de fils et de comparateurs est un réseau de comparateurs. Un réseau de comparateurs qui trie correctement toutes les entrées possibles dans l'ordre croissant est appelé un réseau de tri.
Le schéma ci-dessous montre un réseau de comparateurs. Il est facile de voir pourquoi ce réseau trie correctement les entrées : les quatre premiers comparateurs font descendre la plus grande valeur vers le fil du bas et font remonter la plus petite valeur vers le fil du haut. Le comparateur final trie simplement les valeurs des deux fils du milieu. C'est donc un réseau de tri.
Profondeur et taille
L'efficacitĂ© d'un rĂ©seau de tri peut ĂȘtre mesurĂ©e par sa taille totale, c'est-Ă -dire le nombre de comparateurs utilisĂ©s, ou par sa profondeur , dĂ©finie comme Ă©tant le plus grand nombre de comparateurs qu'une valeur d'entrĂ©e peut rencontrer sur son chemin Ă travers le rĂ©seau. Le rĂ©seau peut effectuer certaines comparaisons en parallĂšle, reprĂ©sentĂ©es dans la notation graphique par des comparateurs qui se trouvent sur la mĂȘme ligne verticale. En supposant que toutes les comparaisons prennent la mĂȘme unitĂ© de temps, la profondeur du rĂ©seau est Ă©gale au nombre d'unitĂ©s de temps requis pour l'exĂ©cuter en parallĂšle[1]:p. 683-684 - [2].
Réseaux de tri par insertion et par sélection
On construit facilement un réseau de tri de taille arbitraire récursivement en utilisant le principe à la base du tri par insertion ou celui du tri par sélection. En supposant l'existence d'un réseau de tri de la taille n , on construit un réseau de taille n + 1 par « insertion » d'une donnée supplémentaire dans le sous-réseau déjà trié en utilisant le principe du tri par insertion. Pour cela, on ajoute au réseau une suite de comparateurs qui insÚre cette derniÚre valeur à sa place. On peut également opérer en utilisant le principe du tri à bulles : on débute par la « sélection » de la valeur la plus grande parmi les entrées, à l'aide d'une suite de comparateurs qui descend la plus grande valeur vers le bas, puis on continue par le tri récursif des valeurs restantes.
Un réseau de tri qui trie d'abord les n premiÚres valeurs, puis insÚre la valeur restante (tri par insertion). |
Un réseau de tri qui descend d'abord la plus grande valeur vers le bas, puis trie les autres valeurs (tri à bulles). |
Ces deux rĂ©seaux de tri, mĂȘme s'ils sont construits selon des principes algorithmiques diffĂ©rent, ont des structures similaires en tant que rĂ©seaux. Lorsqu'on aligne les comparateurs qui peuvent opĂ©rer en parallĂšle, on s'aperçoit qu'en fait ils sont identiques[3].
tri Ă bulles. |
tri par insertion. |
En alignant les comparateurs parallÚles, les deux réseaux sont identiques. |
Ces réseaux de tri - par insertion ou par sélection - ont une profondeur 2n - 3[3], ce qui les rend trop longs en pratique. Il existe de meilleures constructions, présentées plus loin, dont la profondeur est logarithmique en n.
Principe du zéro-un
Le principe du zĂ©ro-un est une propriĂ©tĂ© utile pour dĂ©montrer qu'un rĂ©seau trie correctement les donnĂ©es. Alors qu'il est facile de prouver la validitĂ© de rĂ©seaux de tri dans certains cas particuliers, comme les rĂ©seaux par insertion ou par bulles, la preuve n'est pas toujours aussi facile. Il y a n! permutations de nombres dans un rĂ©seau Ă n fils, et tester tous les cas prend un temps considĂ©rable dĂšs que n est grand Le nombre de cas Ă tester peut ĂȘtre rĂ©duit de maniĂšre significative, Ă 2n, en utilisant ce qu'on appelle le principe du zĂ©ro-un. MĂȘme s'il est toujours exponentiel, 2n est plus petit que n! pour nâ„ 4, et la diffĂ©rence croĂźt rapidement avec n.
Le principe du zéro-un stipule que si un réseau de tri trie correctement les 2n suites composées uniquement de zéros et de uns, alors il trie correctement toute suite d'entrées.
Ce principe non seulement réduit de façon drastique le nombre de test nécessaires pour garantir la validité d'un réseau; il est également d'une grande utilité pour la construction de réseaux de tri.
Démonstration. On constate d'abord le fait suivant sur les comparateurs : si une fonction monotone croissante est appliquée aux entrées, c'est-à -dire si et sont remplacés par et , alors le comparateur produit et . En raisonnant par récurrence sur la profondeur du réseau, ce résultat est étendu en un lemme stipulant que si un réseau transforme une suite en , alors il transforme en .
Supposons maintenant, en raisonnant par lâabsurde, que le rĂ©seau trie les sĂ©quences formĂ©es de zĂ©ros et de uns, mais quâil existe une sĂ©quence de nombres que le rĂ©seau ne trie pas correctement. Alors il existe des entrĂ©es avec que le rĂ©seau Ă©change Ă la sortie. On dĂ©finit une fonction monotone croissante particuliĂšre par
Puisque le rĂ©seau place avant , le lemme dit qu'il place avant dans la sĂ©quence de sortie pour l'entrĂ©e . Mais comme et , le rĂ©seau ne trie pas correctement la sĂ©quence zĂ©ro-un , en contradiction avec l'hypothĂšse de dĂ©part[1]:p. 686â688. Ceci prouve le principe du zĂ©ro-un.
Construction de réseaux de tri
Malgré leur simplicité, la théorie des réseaux de tri est étonnamment profonde et complexe. Les réseaux de tri ont été étudiés pour la premiÚre fois vers 1954 par Armstrong, Nelson et O'Connor[3] qui ensuite ont déposé un brevet pour ce concept[4].
Les rĂ©seaux de tri peuvent ĂȘtre employĂ©s soit en matĂ©riel soit en logiciel. Donald Knuth dĂ©crit la rĂ©alisation d'un comparateur d'entiers binaires par un dispositif Ă©lectronique simple Ă trois Ă©tats[3]. En 1968, Ken Batcher suggĂšre leur emploi pour la construction de rĂ©seaux de commutation pour un ordinateur qui remplacerait Ă la fois les bus informatiques et les interrupteurs plus rapides mais plus coĂ»teux[5]. Depuis les annĂ©es 2000, les rĂ©seaux de tri, et particuliĂšrement le tri par fusion bitonique, sont utilisĂ©s par la communautĂ© GPGPU pour la construction d'algorithmes de tri qui tournent dans le processeur graphique[6].
Il existe plusieurs algorithmes pour construire des réseaux de tri simples et efficaces de profondeur O(log2 n) et de taille O(n log2 n). Parmi eux, il y a notamment[2]
- le réseau de tri de fusion pair-impair de Batcher (en),
- le tri bitonique,
- le tri de Shell et
- le réseau de tri par paires (en).
Ces réseaux sont souvent utilisés en pratique. D'autres, comme le réseau de tri pair-impair par transposition, sont plus simples à réaliser mais moins efficaces.
On peut aussi construire, au moins en thĂ©orie, des rĂ©seaux de taille arbitraire de profondeur logarithmique, en utilisant une mĂ©thode appelĂ©e rĂ©seau AKS, d'aprĂšs ses inventeurs Ajtai, JĂĄnos KomlĂłs, et SzemerĂ©di[7]. Alors qu'il s'agit d'une dĂ©couverte importante en thĂ©orie, le rĂ©seau AKS n'a que peu ou pas d'applications pratiques en raison de la constante de proportionnalitĂ© cachĂ©e dans la notation O, et qui s'Ă©lĂšve Ă plusieurs milliers[1]:669. Pour toutes les valeurs « pratiques » de n, un rĂ©seau de profondeur O(log2 n) est plus efficace. La constante cachĂ©e est due en partie Ă la construction d'un graphe d'expansion employĂ© dans la mĂ©thode. Une version simplifiĂ©e du rĂ©seau AKS a Ă©tĂ© dĂ©crite par Michael S. Paterson, qui note toutefois lui aussi que « la constante pour la borne de la profondeur rend toujours la construction impraticable »[8]. Une autre construction de rĂ©seaux de tri de taille O(n log n) a Ă©tĂ© dĂ©couverte par Michael T. Goodrich (en)[9]. MĂȘme si sa constante est bien plus petite que celle du rĂ©seau AKS, sa profondeur, en O(n log n), la rend inefficace pour une implĂ©mentation en parallĂšle.
RĂ©seaux de tri optimaux
Pour un nombre petit et fixĂ© d'entrĂ©es, on peut construire des rĂ©seaux de tri optimaux, soit qu'ils sont de profondeur minimale (utile pour une exĂ©cution en parallĂšle), soit qu'ils comportent un nombre minimal de comparateurs (ils sont alors de taille minimale). Ces rĂ©seaux peuvent ĂȘtre employĂ©s dans une optique de construction rĂ©cursive, comme briques qui amĂ©liorent les performances de rĂ©seaux plus grands. On peut ainsi arrĂȘter plus tĂŽt la construction rĂ©cursive dans les rĂ©seaux de Batcher par exemple[10]. La table suivante donne les rĂ©sultats d'optimalitĂ© connus :
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Profondeur[11] | 0 | 1 | 3 | 3 | 5 | 5 | 6 | 6 | 7 | 7 | 8 | 8 | 9 | 9 | 9 | 9 |
Taille, majorant[12] | 0 | 1 | 3 | 5 | 9 | 12 | 16 | 19 | 25 | 29 | 35 | 39 | 45 | 51 | 56 | 60 |
Taille, minorant (si différent)[12] | 33 | 37 | 41 | 45 | 49 | 53 |
Les seize premiers réseaux optimaux en profondeurs sont listés dans la section 5.3.4: « Networks for Sorting » du livre Art of Computer Programming de Knuth[3] et étaient déjà présents dans la premiÚre édition de 1973 ; l'optimalité des huit premiÚres valeurs a été prouvée par Robert Floyd et Knuth dans les années 1960, alors que la preuve pour les six derniÚres valeurs date seulement de 2014[11]. Dans leur article, ils expriment le problÚme, aprÚs une réduction astucieuse, par des formules de logique propositionnelle, puis utilisent un logiciel de test de satisfiabilité. Les cas neuf et dix ont été résolus plus tÎt, en 1991, par Parberry[10]. Une autre technique pour trouver des réseaux optimaux est décrite dans une page de Jason D. Hugues[13].
Des rĂ©seaux optimaux en taille sont connus pour un nombre d'entrĂ©es compris entre un et dix ; pour des valeurs plus Ă©levĂ©es, des minorants de la taille S(n) peuvent ĂȘtre dĂ©duit inductivement d'un lemme dĂ» Ă Van Voorhis : . Les dix rĂ©seaux optimaux sont connus depuis 1969, dont les huit premiers sont connus de Floyd et Knuth, mais l'optimalitĂ© des cas n = 9 et n = 10 n'a Ă©tĂ© prouvĂ©e qu'en 2014[12]. De nouveaux rĂ©sultats (en 2017)[14] donnent une rĂ©ponse sur l'optimalitĂ© en profondeur.
Notes et références
- Chapitre 27 : « RĂ©seaux de tri », p. 681-700, dans Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest et Clifford Stein, Introduction Ă l'algorithmique, Dunod, [dĂ©tail de lâĂ©dition]
- (en) H. W. Lang, « Sorting Networks », Algorithmen - Sortieren - Networks, FH Flensburg, Allemagne, (consulté le ).
- Section 5.3.4: Networks for Sorting, pages 219â247, dans (en) Donald E. Knuth, The Art of Computer Programming, vol. 3 : Sorting and Searching, , 2e Ă©d. [dĂ©tail de lâĂ©dition].
- Brevet US 3029413 "Sorting system with n-line sorting switch", enregistré le 21 février 1957, publié le 10 avril 1962, déposé par Daniel G. O'Connor et Raymond J. Nelson
- K. E. Batcher, « Sorting networks and their applications » () (lire en ligne)
âProc. AFIPS Spring Joint Computer Conference - J.D. Owens, M. Houston, D. Luebke, S. Green, J.E. Stone et J.C. Phillips, « GPU Computing », Proceedings of the IEEE, vol. 96, no 5,â , p. 879 - 899 (DOI 10.1109/JPROC.2008.917757).
- MiklĂłs Ajtai, JĂĄnos KomlĂłs et Endre SzemerĂ©di, « Sorting in c log n parallel steps », Combinatorica, vol. 3, no 1,â , p. 1-19 (DOI 10.1007/BF02579338).
- Michael S. Paterson, « Improved sorting networks with O(log N) depth », Algorithmica, vol. 5, nos 1-4,â , p. 75-92 (DOI 10.1007/BF01840378).
- (en) Michael T. Goodrich, « Zig-zag Sort: A Simple Deterministic Data-Oblivious Sorting Algorithm Running in O(n log n) Time », .
- Ian Parberry, « A Computer Assisted Optimal Depth Lower Bound for Nine-Input Sorting Networks », Mathematical Systems Theory, vol. 24,â , p. 101â116 (lire en ligne)
- Daniel Bundala et Jakub ZĂĄvodnĂœ, « Optimal Sorting Networks », Language and Automata Theory and Applications,â , p. 236-247 (ISBN 978-3-319-04920-5, DOI 10.1007/978-3-319-04921-2_19, arXiv 1310.6271)
- La preuve est annoncĂ©e dans (en) Michael Codish, LuĂs Cruz-Filipe, Michael Frank et Peter Schneider-Kamp, « Twenty-Five Comparators is Optimal when Sorting Nine Inputs (and Twenty-Nine for Ten) », .. L'article en revue paraĂźt en 2016 : Michael Codish, LuĂs Cruz-Filipe, Michael Frank et Peter Schneider-Kamp, « Sorting nine inputs requires twenty-five comparisons », Journal of Computer and System Sciences, Elsevier BV, vol. 82, no 3,â , p. 551-563 (ISSN 0022-0000, DOI 10.13039/501100003977).
- (en) Jason D. Hugues, « Sorting networks and the END algorithm », Rabb School of Continuing Studies, Brandeis University (consulté le ).
- (en) Daniel Bundala, Michael Codish, LuĂs Cruz-Filipe, Peter Schneider-Kamp et Jakub ZĂĄvodnĂœ, « Optimal-depth sorting networks », Journal of Computer and System Sciences, vol. 84,â , p. 185â204 (DOI 10.1016/j.jcss.2016.09.004).
-
Ian Parberry « On the Computational Complexity of Optimal Sorting Network Verification » ()
â « (ibid.) », Proc. PARLE '91: Parallel Architectures and Languages Europe, Volume I: Parallel Architectures and Algorithms, Eindhoven, The Netherlands,â , p. 252â269. - Ian Parberry, « On the Computational Complexity of Optimal Sorting Network Verification », dans PARLE '91: Parallel Architectures and Languages Europe, vol. I. Parallel Architectures and Algorithms, Springer, coll. « Lecture Notes in Computer Science » (no 505), , 252â269 p..
Lien externe
- Richard J. Lipton et Ken Regan, « Galactic Sorting Networks », sur Gödelâs Lost Letter and P=NP,