L'idée d'un algorithme sur place n'est pas unique pour le tri, mais le tri est probablement le plus important de cas, ou tout au moins les plus connus. L'idée est à propos de l'efficacité de l'espace - à l'aide de la quantité minimale de RAM, disque dur ou autre support de stockage que vous pouvez sortir avec. Cela était particulièrement pertinent de revenir quelques décennies, lorsque le matériel a été beaucoup plus limitée.
L'idée est de produire une sortie dans le même espace de mémoire qui contient l'entrée successivement en transformant ces données jusqu'à ce que la sortie est produite. Cela évite de devoir utiliser deux fois le stockage, une zone pour l'entrée et une taille égale zone de la sortie.
Tri est assez flagrant pour cela, car le tri peut être fait à plusieurs reprises par l'échange de points - tri ré-organise les éléments. Les échanges ne sont pas la seule approche - le Le Tri Par Insertionpar exemple, utilise une approche légèrement différente qui est équivalent à une course d'échanges, mais plus rapide.
Un autre exemple est matrice de transposition - encore une fois, cela peut être mis en œuvre par l'échange de produits. L'ajout de deux très grands nombres peuvent également être effectuée sur place (le résultat le remplacement de l'une des entrées) en partant du chiffre le moins significatif et propogating porte vers le haut.
Retour à la tri, les avantages de ré-arranger "en place" d'obtenir encore plus évident quand vous pensez à des piles de les cartes perforées - il est préférable d'éviter de copier des cartes perforées juste pour les trier.
Certains algorithmes de tri permettre ce style de en place de l'opération alors que ne pas.
Cependant, tous les algorithmes nécessitent certains de stockage supplémentaire pour le travail variables. Si l'objectif est simplement de produire successivement la modification de l'entrée, il est assez facile de définir des algorithmes qui ne que par la réservation d'un énorme morceau de la mémoire, en utilisant que la production de certains auxiliaires de la structure de données, puis en utilisant le guide de ces modifications. Vous êtes encore en production à la sortie par la transformation de l'entrée "en place", mais vous êtes en battant le point de l'ensemble de l'exercice, - vous n'êtes pas en cours de l'espace-efficace.
Pour cette raison, la définition d'une définition exige que vous atteindre un certain niveau de l'efficacité de l'espace. Il n'est absolument pas acceptable d'utiliser l'espace supplémentaire proportionnelle à l'entrée (qui est, en O(n) de l'espace supplémentaire) et toujours appeler votre algorithme "en place".
La Page Wikipedia sur place algorithmes actuellement prétend qu'un algorithme ne peut utiliser qu'une quantité constante - O(1) - de l'espace supplémentaire.
En informatique, un algorithme sur place (ou en Latin in situ) est un algorithme qui transforme l'entrée à l'aide d'une structure de données avec une petite quantité constante de l'espace de stockage supplémentaire.
Il y a quelques détails techniques spécifiés dans le Dans La Complexité De Calcul section, mais la conclusion est toujours que, par exemple, Quicksort nécessite O(log n) de l'espace (vrai) et n'est donc pas en place (je crois que c'est faux).
O(log n) est beaucoup plus petit que O(n) - par exemple, la base de 2 log de 16,777,216 est de 24.
Quicksort et heapsort sont à la fois normalement considérées comme étant en place, et heapsort peut être mis en œuvre avec O(1) en sus de l'espace (je me suis trompé au sujet de cette plus tôt). Mergesort est plus difficile à mettre en place, mais l'endroit est très cache-amical - je soupçonne monde réel accepter le O(n) de l'espace de tête - RAM n'est pas cher mais de la bande passante mémoire est un goulot d'étranglement majeur, de sorte que la négociation de la mémoire pour le cache-efficacité et la vitesse est souvent une bonne affaire.
[MODIFIER Quand j'ai écrit ci-dessus, je suppose que je pensais en place de fusion-tri d'un tableau. En place de fusion-tri d'une liste chaînée est très simple. La différence essentielle est dans l'algorithme de fusion - faire une fusion de deux listes liées avec aucune copie ou la réaffectation est facile, faire de même avec les deux sous-ensembles d'un ensemble plus grand (et sans O(n) auxiliaire de stockage) autant que je sache, n'est-ce pas.]
Quicksort est aussi cache-efficace, même sur place, mais peut être disqualifié comme un algorithme sur place, en faisant appel à ses pires cas de comportement. Il est un cas dégénéré (non randomisée version, en général, lorsque l'entrée est déjà trié) où le temps d'exécution est O(n^2) plutôt que de l'attendre O(n log n). Dans ce cas, l'espace supplémentaire exigence est également porté à O(n). Cependant, pour les grands ensembles de données et avec certaines précautions de base (principalement randomisés pivot de la sélection) ce pire des cas, le comportement devient ridiculement peu probable.
Mon avis personnel est que O(log n) de l'espace supplémentaire est acceptable pour les algorithmes - il n'est pas tricher, comme il n'a pas la défaite de l'original du point de travail en place.
Cependant, mon avis est bien sûr que mon avis.
Une note - parfois, les gens vont appeler une fonction en place tout simplement parce qu'il a un seul paramètre à la fois l'entrée et la sortie. Il n'est pas nécessairement que la fonction a été efficace de l'espace, que le résultat a été produite par la transformation de l'entrée, ou même que le paramètre toujours référence à la même zone de mémoire. Cette utilisation n'est pas correct (ou si le prescriptivists prétendent), mais c'est assez commun qu'il est préférable d'être conscient, mais ne pas se stresser à ce sujet.
3
Je ne pense pas que ces termes sont étroitement liés:
De tri en place moyen de trier une liste existante par la modification de l'élément de commande directement dans la liste. Le contraire est en laissant l'original liste est et de créer un nouvelle liste avec les éléments dans l'ordre.
Ordre naturel est un terme qui décrit comment des objets peut en quelque sorte être commandés. Vous pouvez par exemple dire que 0 est plus faible que 1 (ordre naturel pour les entiers) ou que A est avant B dans l'ordre alphabétique (ordre naturel pour les chaînes). Vous pouvez à peine dire que Bob est supérieur ou inférieur à Alice en général car elle dépend fortement des attributs spécifiques (par ordre alphabétique par nom, par tranche d'âge, revenu, ...). Par conséquent, il est pas d'ordre naturel pour les gens.
2
En place le tri des moyens de tri, sans aucun espace supplémentaire requis. Selon wiki , il dit
un algorithme est un algorithme qui transforme l'entrée à l'aide d'une structure de données avec une petite quantité constante de l'espace de stockage supplémentaire.
Je ne suis pas sûr que ces concepts sont assez semblables à comparer, comme l'a suggéré. Oui, ils impliquent tous deux de tri, mais on est sur un ordre de tri qui est humain compréhensible (naturel) et de l'autre définit un algorithme de tri efficace en termes de mémoire en les écrasant dans la structure existante au lieu d'utiliser une structure de données supplémentaires (comme le tri à bulles)
0
il peut être fait en utilisant la fonction d'échange , au lieu de faire une toute nouvelle structure , nous mettons en œuvre cet algorithme, sans même le savoir, c'est le nom 😀
L'idée d'un algorithme sur place n'est pas unique pour le tri, mais le tri est probablement le plus important de cas, ou tout au moins les plus connus. L'idée est à propos de l'efficacité de l'espace - à l'aide de la quantité minimale de RAM, disque dur ou autre support de stockage que vous pouvez sortir avec. Cela était particulièrement pertinent de revenir quelques décennies, lorsque le matériel a été beaucoup plus limitée.
L'idée est de produire une sortie dans le même espace de mémoire qui contient l'entrée successivement en transformant ces données jusqu'à ce que la sortie est produite. Cela évite de devoir utiliser deux fois le stockage, une zone pour l'entrée et une taille égale zone de la sortie.
Tri est assez flagrant pour cela, car le tri peut être fait à plusieurs reprises par l'échange de points - tri ré-organise les éléments. Les échanges ne sont pas la seule approche - le Le Tri Par Insertionpar exemple, utilise une approche légèrement différente qui est équivalent à une course d'échanges, mais plus rapide.
Un autre exemple est matrice de transposition - encore une fois, cela peut être mis en œuvre par l'échange de produits. L'ajout de deux très grands nombres peuvent également être effectuée sur place (le résultat le remplacement de l'une des entrées) en partant du chiffre le moins significatif et propogating porte vers le haut.
Retour à la tri, les avantages de ré-arranger "en place" d'obtenir encore plus évident quand vous pensez à des piles de les cartes perforées - il est préférable d'éviter de copier des cartes perforées juste pour les trier.
Certains algorithmes de tri permettre ce style de en place de l'opération alors que ne pas.
Cependant, tous les algorithmes nécessitent certains de stockage supplémentaire pour le travail variables. Si l'objectif est simplement de produire successivement la modification de l'entrée, il est assez facile de définir des algorithmes qui ne que par la réservation d'un énorme morceau de la mémoire, en utilisant que la production de certains auxiliaires de la structure de données, puis en utilisant le guide de ces modifications. Vous êtes encore en production à la sortie par la transformation de l'entrée "en place", mais vous êtes en battant le point de l'ensemble de l'exercice, - vous n'êtes pas en cours de l'espace-efficace.
Pour cette raison, la définition d'une définition exige que vous atteindre un certain niveau de l'efficacité de l'espace. Il n'est absolument pas acceptable d'utiliser l'espace supplémentaire proportionnelle à l'entrée (qui est, en O(n) de l'espace supplémentaire) et toujours appeler votre algorithme "en place".
La Page Wikipedia sur place algorithmes actuellement prétend qu'un algorithme ne peut utiliser qu'une quantité constante - O(1) - de l'espace supplémentaire.
Il y a quelques détails techniques spécifiés dans le Dans La Complexité De Calcul section, mais la conclusion est toujours que, par exemple, Quicksort nécessite O(log n) de l'espace (vrai) et n'est donc pas en place (je crois que c'est faux).
O(log n) est beaucoup plus petit que O(n) - par exemple, la base de 2 log de 16,777,216 est de 24.
Quicksort et heapsort sont à la fois normalement considérées comme étant en place, et heapsort peut être mis en œuvre avec O(1) en sus de l'espace (je me suis trompé au sujet de cette plus tôt). Mergesort est plus difficile à mettre en place, mais l'endroit est très cache-amical - je soupçonne monde réel accepter le O(n) de l'espace de tête - RAM n'est pas cher mais de la bande passante mémoire est un goulot d'étranglement majeur, de sorte que la négociation de la mémoire pour le cache-efficacité et la vitesse est souvent une bonne affaire.
[MODIFIER Quand j'ai écrit ci-dessus, je suppose que je pensais en place de fusion-tri d'un tableau. En place de fusion-tri d'une liste chaînée est très simple. La différence essentielle est dans l'algorithme de fusion - faire une fusion de deux listes liées avec aucune copie ou la réaffectation est facile, faire de même avec les deux sous-ensembles d'un ensemble plus grand (et sans O(n) auxiliaire de stockage) autant que je sache, n'est-ce pas.]
Quicksort est aussi cache-efficace, même sur place, mais peut être disqualifié comme un algorithme sur place, en faisant appel à ses pires cas de comportement. Il est un cas dégénéré (non randomisée version, en général, lorsque l'entrée est déjà trié) où le temps d'exécution est O(n^2) plutôt que de l'attendre O(n log n). Dans ce cas, l'espace supplémentaire exigence est également porté à O(n). Cependant, pour les grands ensembles de données et avec certaines précautions de base (principalement randomisés pivot de la sélection) ce pire des cas, le comportement devient ridiculement peu probable.
Mon avis personnel est que O(log n) de l'espace supplémentaire est acceptable pour les algorithmes - il n'est pas tricher, comme il n'a pas la défaite de l'original du point de travail en place.
Cependant, mon avis est bien sûr que mon avis.
Une note - parfois, les gens vont appeler une fonction en place tout simplement parce qu'il a un seul paramètre à la fois l'entrée et la sortie. Il n'est pas nécessairement que la fonction a été efficace de l'espace, que le résultat a été produite par la transformation de l'entrée, ou même que le paramètre toujours référence à la même zone de mémoire. Cette utilisation n'est pas correct (ou si le prescriptivists prétendent), mais c'est assez commun qu'il est préférable d'être conscient, mais ne pas se stresser à ce sujet.
Je ne pense pas que ces termes sont étroitement liés:
De tri en place moyen de trier une liste existante par la modification de l'élément de commande directement dans la liste. Le contraire est en laissant l'original liste est et de créer un nouvelle liste avec les éléments dans l'ordre.
Ordre naturel est un terme qui décrit comment des objets peut en quelque sorte être commandés. Vous pouvez par exemple dire que 0 est plus faible que 1 (ordre naturel pour les entiers) ou que A est avant B dans l'ordre alphabétique (ordre naturel pour les chaînes). Vous pouvez à peine dire que Bob est supérieur ou inférieur à Alice en général car elle dépend fortement des attributs spécifiques (par ordre alphabétique par nom, par tranche d'âge, revenu, ...). Par conséquent, il est pas d'ordre naturel pour les gens.
En place le tri des moyens de tri, sans aucun espace supplémentaire requis. Selon wiki , il dit
Quicksort est un exemple de la Place de Tri.
Je ne suis pas sûr que ces concepts sont assez semblables à comparer, comme l'a suggéré. Oui, ils impliquent tous deux de tri, mais on est sur un ordre de tri qui est humain compréhensible (naturel) et de l'autre définit un algorithme de tri efficace en termes de mémoire en les écrasant dans la structure existante au lieu d'utiliser une structure de données supplémentaires (comme le tri à bulles)
il peut être fait en utilisant la fonction d'échange , au lieu de faire une toute nouvelle structure , nous mettons en œuvre cet algorithme, sans même le savoir, c'est le nom 😀