web-dev-qa-db-fra.com

Le tri en informatique par opposition au tri dans le monde réel

Je pensais au tri des algorithmes dans les logiciels et aux moyens possibles de surmonter le barrage routier O(nlogn). Je ne pense pas qu'il soit IS possible de trier plus rapidement dans un sens pratique, alors s'il vous plaît, ne pensez pas que je le fais.

Cela dit, il semble qu'avec presque tous les algorithmes de tri, le logiciel doit connaître la position de chaque élément. Ce qui a du sens, sinon, comment pourrait-il savoir où placer chaque élément en fonction de certains critères de tri?

Mais lorsque j'ai croisé cette pensée avec le monde réel, une centrifugeuse n'a aucune idée de la position de chaque molécule lorsqu'elle "trie" les molécules par densité. En fait, peu importe la position de chaque molécule. Cependant, il peut trier des milliards d'éléments sur une période relativement courte, car chaque molécule respecte les lois de la densité et de la gravitation, ce qui m'a fait réfléchir.

Serait-il possible avec une surcharge sur chaque nœud (une valeur ou une méthode ajoutée à chacun des nœuds) de "forcer" l'ordre de la liste? Quelque chose comme une centrifugeuse, où chaque élément seulement se soucie de sa position relative dans l'espace (par rapport aux autres nœuds). Ou est-ce que cela enfreint une règle de calcul?

Je pense que l’un des gros points soulevés ici concerne les effets de la nature quantiques sur la mécanique quantique et la façon dont ils s’appliquent en parallèle à toutes les particules simultanément.

Peut-être que les ordinateurs classiques limitent de manière inhérente le tri au domaine de O(nlogn), où les ordinateurs quantiques peuvent éventuellement dépasser ce seuil dans des algorithmes O(logn) agissant en parallèle.

Le point qu’une centrifugeuse est essentiellement un type de bulle parallèle semble être correct, ce qui a une complexité temporelle de O(n).

Je pense que l’idée suivante est que si la nature peut trier O(n), pourquoi les ordinateurs ne le peuvent-ils pas?

87
Kris

EDIT: J'avais mal compris le mécanisme d'une centrifugeuse et il semble que ce soit une comparaison, une comparaison massivement parallèle. Cependant, il existe des processus physiques qui opèrent sur une propriété de l'entité en cours de tri plutôt que de comparer deux propriétés. Cette réponse couvre les algorithmes de cette nature.

Une centrifugeuse applique un mécanisme de tri qui ne fonctionne pas vraiment au moyen de comparaisons entre éléments, mais en réalité par une propriété ("force centrifuge") appliquée individuellement à chaque élément.Certains algorithmes de tri relèvent de ce thème, notamment Radix Sort . Lorsque cet algorithme de tri est mis en parallèle, il devrait s'approcher de l'exemple d'une centrifugeuse.

Quelques autres algorithmes de tri non comparatifs sont Sorte par seau et Tri par comptage . Vous constaterez peut-être que le tri par seau correspond également à l'idée générale d'une centrifugeuse (le rayon peut correspondre à une poubelle).

Un autre algorithme appelé «algorithme de tri» dans lequel chaque élément est considéré isolément est le Sleep Sort . Ici, le temps plutôt que la force centrifuge agit comme la magnitude utilisée pour le tri.

72
user1952500

La complexité de calcul est toujours définie par rapport à un modèle de calcul. Par exemple, un algorithme qui est O (n) sur un ordinateur typique peut être O (2n) si implémenté dans Brainfuck .

Le modèle de calcul centrifuge a des propriétés intéressantes; par exemple:

  • il supporte le parallélisme arbitraire; quel que soit le nombre de particules présentes dans la solution, elles peuvent toutes être triées simultanément.
  • cela ne donne pas une sorte linéaire stricte de particules en masse, mais plutôt une approximation très proche (basse énergie).
  • il n'est pas possible d'examiner les particules individuelles dans le résultat.
  • il n'est pas possible de trier les particules selon différentes propriétés; seule la masse est supportée.

Étant donné que nous ne sommes pas en mesure de mettre en œuvre quelque chose comme cela dans le matériel informatique à usage général, le modèle peut ne pas avoir de pertinence pratique; mais cela peut quand même valoir la peine d'être examiné pour voir s'il y a quelque chose à en tirer. Les algorithmes non déterministes et les algorithmes quantiques ont tous deux été des domaines de recherche actifs, par exemple, même si aucun d’eux n’est réellement réalisable aujourd’hui.

36
ruakh

Le truc est là: vous avez seulement une probabilité de trier votre liste en utilisant une centrifugeuse. Comme avec d'autres tris du monde réel [citation nécessaire], vous pouvez modifier la probabilité que vous ayez trié votre liste, mais ne jamais être certain sans vérifier toutes les valeurs (atomes).

Considérez la question: "Combien de temps devriez-vous utiliser votre centrifugeuse?"
Si vous ne l'avez exécuté que pendant une picoseconde, votre échantillon sera peut-être moins trié que l'état initial .. ou si vous l'avez exécuté pendant quelques jours, il peut être complètement trié. Cependant, vous ne sauriez pas sans vérifier réellement le contenu.

30
ti7

Un exemple concret de "commande" sur ordinateur serait constitué par les drones autonomes coopérant les uns avec les autres, appelés "essaims de drones". Les drones agissent et communiquent à la fois individuellement et collectivement, et peuvent suivre plusieurs cibles. Les drones décident collectivement quels drones suivront quelles cibles et le besoin évident d'éviter des collisions entre drones. Les premières versions étaient des drones qui traversaient des points de passage tout en restant en formation, mais la formation pouvait changer. 

Pour une "sorte", les drones pourraient être programmés pour former une ligne ou un motif dans un ordre spécifique, initialement libérés sous n'importe quelle permutation ou forme, et collectivement et en parallèle, ils formeraient rapidement la ligne ou le motif ordonné.

Pour revenir à un tri sur ordinateur, un problème est qu’il existe un bus de mémoire principal et qu’il est impossible pour un grand nombre d’objets de se déplacer en mémoire en parallèle. 

connaître la position de chaque élément

Dans le cas d'un tri sur bande, la position de chaque élément (enregistrement) est uniquement "connue" de la "bande", pas de l'ordinateur. Un tri sur bande ne doit fonctionner qu'avec deux éléments à la fois et un moyen d'indiquer les limites d'exécution sur une bande (marque de fichier ou un enregistrement de taille différente).

5
rcgldr

J'ai travaillé dans un bureau l'été après le lycée quand j'ai commencé mes études. J'avais étudié à AP Computer Science, entre autres choses, tri et recherche.

J'ai appliqué cette connaissance à plusieurs systèmes physiques dont je me souviens:

Une sorte de fusion naturelle pour commencer…

Un système imprimait des formulaires en liasse comprenant une feuille déchirable de la taille d'une carte de fichier, qui devait être classée dans une banque de tiroirs.

J'ai commencé avec un tas d'entre eux et j'ai d'abord trié le tas. La première étape consiste à en ramasser 5 ou plus, assez peu pour être facilement mis en ordre dans votre main. Placez le paquet trié vers le bas, en croisant chaque pile pour les séparer.

Ensuite, fusionner chaque paire de piles, produisant une pile plus grande. Répétez jusqu'à ce qu'il n'y ait plus qu'une pile.

… Tri par insertion à compléter

Il est plus facile de classer les cartes triées, chaque carte étant un peu plus loin dans le même tiroir ouvert.

Sorte de radix

Celui-ci, personne d'autre n'a compris comment je l'avais fait si vite, malgré les tentatives répétées d'enseigner.

Une grande boîte de talons de chèques (la taille des cartes perforées) doit être triée. Cela ressemble à jouer au solitaire sur une grande table: traitez, empilez, répétez.

En général

Il y a 30 ans, j'ai remarqué ce que vous demandiez: les idées sont directement transférées aux systèmes physiques, car il existe des coûts relatifs de comparaisons et gestion des enregistrements, ainsi que des niveaux de mise en cache.

Aller au-delà des équivalents bien compris

Je me souviens d'un essai sur votre sujet, et il a évoqué le genre spaghetti. Vous coupez une longueur de nouille séchée pour indiquer la valeur de clé, puis vous l'étiquetez avec l'ID d'enregistrement. C'est O (n), il suffit de traiter chaque élément une fois.

Ensuite, vous prenez le paquet et appuyez sur une extrémité de la table. Ils s'alignent sur les bords inférieurs et sont maintenant triés. Vous pouvez trivialement enlever le plus long, et répéter. La lecture est aussi O (n).

Il y a deux choses qui se passent ici dans le «monde réel» qui ne correspondent pas aux algorithmes. Tout d’abord, l’alignement des bords est une opération parallèle. Chaque donnée est également un processeur (les lois de la physique lui sont applicables). Ainsi, en général, vous mettez à l'échelle le traitement disponible avec n, en divisant essentiellement votre complexité classique par un facteur sur n.

Deuxièmement, comment l’alignement des bords permet-il d’obtenir une sorte? Le vrai tri se trouve dans la lecture, ce qui vous permet de trouver le plus long en une étape, même si vous avez tout comparé pour trouver le plus long. Encore une fois, divisez par un facteur de n, si bien que trouver le plus grand est maintenant O (1).

Un autre exemple est l’utilisation de l’informatique analogique: un modèle physique résout le problème «instantanément» et le travail de préparation est O (n). En principe, le calcul est mis à l'échelle avec le nombre de composants en interaction, pas le nombre d'éléments préparés. Le calcul est donc échelonné avec n². L'exemple auquel je pense est un calcul multi-facteurs pondéré, qui a été réalisé en perçant des trous dans une carte, en suspendant des poids à des chaînes passant par les trous et en rassemblant toutes les chaînes sur un anneau.

4
JDługosz

IMHO, les gens pensent trop (n). O(nlog(n)) IS pratiquement O (n). Et vous avez besoin de O(n) pour lire les données.

De nombreux algorithmes tels que quicksort fournissent un moyen très rapide de trier les éléments. Vous pouvez implémenter des variantes de quicksort qui seraient très rapides en pratique.

Tous les systèmes physiques sont intrinsèquement parallèles. Vous pourriez avoir une charge d'atomes dans un grain de sable, la nature a suffisamment de puissance de calcul pour déterminer où devrait se trouver chaque électron dans chaque atome. Donc, si vous avez assez de ressources de calcul (processeurs O (n)), vous pouvez trier n nombres dans le temps log (n).

De commentaires:

  1. Avec un processeur physique ayant un nombre k d'éléments, il peut atteindre une parallélité d'au plus O (k). Si vous traitez n nombres arbitrairement, il le traiterait toujours à une vitesse liée à k. En outre, vous pourriez formuler ce problème physiquement. Vous pouvez créer n billes d’acier avec des poids proportionnels au nombre que vous voulez encoder, ce qui pourrait être résolu par une centrifugeuse dans une théorie. Mais ici, la quantité d’atomes que vous utilisez est proportionnelle à n. Alors que dans un cas standard vous avez un nombre limité d'atomes dans un processeur.

  2. Une autre façon de penser à cela est, disons que vous avez un petit processeur attaché à chaque numéro et que chaque processeur peut communiquer avec ses voisins, vous pouvez trier tous ces nombres en O(log(n)).

4
ElKamina

Le tri est toujours O(n) temps total. C’est plus rapide que cela à cause de Parallelization.

Vous pouvez voir une centrifugeuse comme un Bucketsort de n atomes, mis en parallèle sur n noyaux (chaque atome agit comme un processeur).

Vous pouvez accélérer le tri par parallélisation, mais uniquement par un facteur constant car le nombre de processeurs est limité, O(n/C) est toujours O(n) (les processeurs ont généralement <10 cœurs et GPU <6000)

3
Siphor

La centrifugeuse ne trie pas les noeuds, elle leur applique une force, puis ils réagissent en parallèle . Donc, si vous implémentez un type de bulle où chaque noeud se déplace en parallèle vers le haut ou le bas " densité ", vous auriez une implémentation de centrifugeuse.

N'oubliez pas que dans le monde réel, vous pouvez exécuter un très grand nombre de tâches parallèles, alors que sur un ordinateur, vous pouvez avoir un maximum de tâches parallèles réelles égales au nombre d'unités de traitement physiques.

Au final, l'accès à la liste des éléments serait également limité car il ne peut pas être modifié simultanément par deux nœuds ...

2
Foxtrot Romeo

Tout d’abord, vous comparez deux contextes différents, l’un est la logique (informatique) et l’autre, la physique, ce qui prouve (jusqu’à présent) que nous pouvons en modéliser certaines parties à l’aide de formules mathématiques et que nous, programmeurs, pouvons simuler ces formules. (certaines parties de) la physique dans le travail logique (par exemple, le moteur de physique dans le moteur de jeu).

Deuxièmement, dans le monde de l'informatique (logique), des possibilités presque impossibles en physique, par exemple, nous pouvons accéder à la mémoire et trouver l'emplacement exact de chaque entité à chaque fois, mais en physique, le problème est énorme Le principe d'incertitude de Heisenberg .

Troisièmement, si vous voulez cartographier les centrifugeuses et leur fonctionnement dans le monde réel, c’est comme si quelqu'un (le dieu) vous avait donné un super-ordinateur avec toutes les règles de la physique appliquée et que vous y effectuiez votre petit tri ( en utilisant une centrifugeuse) et en disant que votre problème de tri a été résolu en o(n), vous ignorez l’énorme simulation physique en arrière-plan ... 

1
Mr.Q

Serait-il possible avec une surcharge sur chaque nœud (une valeur ou une méthode Attachée à chacun des nœuds) de "forcer" l'ordre du. liste?

Lorsque nous trions à l'aide de programmes informatiques, nous sélectionnons une propriété des valeurs en cours de tri. C'est généralement la magnitude du nombre ou de l'ordre alphabétique.

Quelque chose comme une centrifugeuse, où seulement chaque élément se soucie de son position relative dans l'espace (par rapport aux autres nœuds)

Cette analogie me rappelle fort bien le simple type de bulle. Comment des nombres plus petits bouillonnent à chaque itération. Comme votre logique de centrifugeuse.

Donc, pour répondre à cette question, ne faisons-nous pas réellement quelque chose de ce genre dans le tri basé sur logiciel?

1
Sudip Bhandari

Une autre perspective est que ce que vous décrivez avec la centrifugeuse est analogue à ce que l’on appelle le "type spaghetti" ( https://en.wikipedia.org/wiki/Spaghetti_sort ). Supposons que vous ayez une boîte de tiges de spaghetti non cuites de différentes longueurs. Tenez-les dans votre poing et desserrez votre main pour les abaisser verticalement afin que les extrémités reposent sur une table horizontale. Boom! Ils sont triés par hauteur. O(constant) temps. (Ou O(n) si vous incluez les tiges par taille et les mettez dans un étagère à spaghettis, je suppose?)

Vous pouvez noter ici qu'il est O(constant) dans le nombre de morceaux de spaghetti, mais, en raison de la vitesse finie du son dans les spaghettis, il s'agit de O(n) dans la longueur du plus long brin . Donc, rien ne vient gratuitement.

0
eac2222

Considérez: le "tri par centrifugation" vraiment est-il meilleur? Pensez à ce qui se passe à mesure que vous progressez.

  • Les éprouvettes doivent être de plus en plus longues.
  • Les choses lourdes doivent voyager de plus en plus loin pour aller au fond des choses.
  • Le moment d'inertie augmente, nécessitant plus de puissance et plus de temps pour accélérer jusqu'à la vitesse de tri.

Cela vaut également la peine d’envisager d’autres problèmes liés au tri par centrifugation. Par exemple, vous ne pouvez opérer que sur une échelle de taille réduite. Un algorithme de tri informatique peut gérer des nombres entiers de 1 à 2 ^ 1024 et au-delà, sans transpiration. Mettez quelque chose qui pèse 2 ^ 1024 fois plus qu'un atome d'hydrogène dans une centrifugeuse et, bon, c'est un trou noir et la galaxie a été détruite. L'algorithme a échoué.

Bien sûr, la vraie réponse ici est que la complexité de calcul est relative à un modèle de calcul, comme mentionné dans une autre réponse. Et le "tri par centrifugation" n'a pas de sens dans le contexte de modèles de calcul courants, tels que le modèle RAM ou le modèle IO ou les machines de Turing à bandes multiples.

0
Craig Gidney