web-dev-qa-db-fra.com

Quicksort est-il en place ou non?

L'efficacité spatiale de Quicksort est donc O (log (n)). Il s'agit de l'espace requis pour maintenir la pile d'appels.

Maintenant, selon la page Wikipedia sur Quicksort , cela se qualifie comme un algorithme sur place, car l'algorithme échange simplement des éléments dans la structure de données d'entrée.

Selon cette page cependant, l'efficacité spatiale de O (log n) disqualifie Quicksort d'être en place, car son efficacité spatiale est supérieure à O (1). Selon cette définition, aucun algorithme avec une efficacité spatiale supérieure à O(1) n'est pas en place. Je suppose donc que cela signifie que tous les algorithmes récursifs ne sont par définition pas en place?

Il est donc évident qu'il existe deux définitions différentes de "en place" ici. Wikipédia n'est pas toujours une source entièrement fiable, j'ai donc consulté l'un de mes professeurs.

Mon professeur était d'accord avec la deuxième définition. Il a dit que Quicksort n'est pas en place. Même si les données restent dans le tableau d'entrée, l'espace supplémentaire nécessaire pour la pile les disqualifie. Mon professeur a écrit un livre populaire sur les algorithmes, donc je respecte beaucoup son opinion, mais cette réponse ne me semble tout simplement pas correcte.

Je vois la propriété de sur place comme étant tout à fait littérale. Les données restent en place. Il ne se déplace pas de sa structure de données d'origine. Pour moi, cette définition est plus utile, car elle signifie que vous pouvez exécuter votre algorithme avec des pointeurs au lieu de vous obliger à copier des données. Cela semble être une propriété précieuse d'un algorithme et digne du nom "sur place".

29
Akeenan

Introduction aux algorithmes from MIT Press qualifie QuickSort comme en place - il trie les éléments du tableau avec au plus une quantité constante d'entre eux en dehors du tableau à un moment donné.

À la fin de la journée, les gens auront toujours des opinions différentes (la mémorisation descendante est-elle considérée comme une programmation dynamique? Pas pour certains "classiques"), du côté de ceux en qui vous avez le plus confiance. Je fais confiance aux éditeurs et aux auteurs de MIT Press (avec mon professeur, qui le qualifie de sur place).

En règle générale, le problème avec QuickSort n'est pas qu'il ne trie pas sur place, mais qu'il n'est pas stable - les données satellite ne sont pas conservées dans l'ordre.

Modifier

Le point de Kuroi met en évidence une partie de cet argument, je pense, est très important.

Beaucoup soutiennent qu'il nécessite O(log(n)) mémoire supplémentaire pour les appels récursifs et que les données sont divulguées sous la forme d'indices sur la pile, mais cela est négligeable pour les très grandes tailles de N (log (1 000 000 000) = ~ 30) et il ignore le fait que généralement le déplacement de données sur le tas prend beaucoup, beaucoup plus de temps, lorsque taille (données) >> taille (index).

Les indices des données ne sont pas les éléments eux-mêmes - donc les éléments des données ne sont pas stockés en dehors du tableau, à part une quantité constante d'entre eux (dans chaque appel).

18
C.B.

Strictement parlant, Quicksort a une efficacité spatiale de O(n) car le cas dégénéré nécessiterait un index sur la pile pour chaque élément du tableau. Bien qu'en moyenne ce sera O (log (n Étant donné que je ne pense pas qu'il soit possible de l'appeler un algorithme "sur place", sauf si vous choisissez une définition dégénérée de "sur place", ce qui signifie que les données d'origine ne sont pas stockées en dehors du tableau d'origine. limites (à l'exclusion des opérations de copie/échange).

Cette définition de "en place" serait dégénérée car vous pourriez prendre n'importe quel algorithme "hors de place" et le faire satisfaire à cette exigence "en place" en lui faisant effectuer tous ses pointeurs d'utilisation de stockage de données supplémentaires vers le tableau d'origine. Ensuite, lorsque la réponse est trouvée, vous pouvez réorganiser le tableau d'origine "en place" en utilisant les données du pointeur.

7
Kerry

qsort échange effectivement les données en place, mais l'espace de pile utilisé pour la récursivité est dans le journal2(N).

Ces deux propriétés ne sont pas contradictoires. Habituellement, "en place" fait référence à la mémoire de tas, c'est-à-dire ce que vous devez allouer explicitement pour que l'algorithme fonctionne.

Cependant, une complexité d'espace logarithmique est fondamentalement négligeable, sauf dans les cas pathologiques (disons que vous voulez faire un tri rapide sur un microcontrôleur 8 bits avec 512 octets de pile :)).

3
kuroi neko

Tout dépend de la définition de l'algorithme "sur place".

Si vous définissez "sur place" comme nécessitant une quantité constante de mémoire, alors le tri rapide n'est pas "sur place" car il nécessite de la mémoire log (N) pour la récursivité.

Si vous définissez "sur place" comme plus convivial "ne déplace pas les données en dehors de la structure d'entrée", alors le tri rapide n'est pas à nouveau "sur place". Les données fuient dans la mémoire sous forme d'indices avec lesquels la méthode de tri rapide est invoquée, qui sont nécessaires au fonctionnement de l'algorithme. Le contenu de cette mémoire supplémentaire directement dépend de l'entrée, comment il ne fuit pas?

Si vous définissez "sur place" comme non copiant, alors qu'en est-il d'un algorithme stupide pour trouver la somme d'un tableau: créez un autre tableau de longueur (n - 1) avec des éléments comme b [i] = a [i + 1 ] + a [0]/n. C'est un peu la copie, bien que le contenu soit différent, mais le contenu de cette mémoire supplémentaire est fonction des données d'entrée, tout comme les indices conservés sur la pile dans l'algorithme de tri rapide.

Je pense que la définition wikipedia de "sur place" est la plus utile, et selon elle, le tri rapide n'est pas "sur place" car il utilise une quantité de mémoire non constante.

1
abraabra