Actualisation de l'algorithme. Pourquoi heapsort est un algorithme d'insort?

15

Je ne vois pas pourquoi le tri sélectif est considéré comme un algorithme de tri sur place .

Je veux dire qu'une structure de données supplémentaire remplie avec les éléments du tableau à trier, c'est-à-dire un tas, est utilisée pour aider à l'extraction de la valeur min et au processus de tri.

Alors peut-être que je me méprends sur la définition de inplace ici?

Mais par exemple par insertion, il est évident qu'il s'agit d'un algorithme in situ, c'est-à-dire qu'aucune mémoire supplémentaire n'est nécessaire pour les éléments.

Alors pourquoi est-il considéré comme étant en place?

user10326
la source

Réponses:

12

Je veux dire qu'une structure de données supplémentaire remplie avec les éléments du tableau à trier, c'est-à-dire un tas, est utilisée pour aider à l'extraction de la valeur min et au processus de tri.

Non. Le tableau est transformé pour se conformer à la contrainte de tas sans utiliser plus de O (1) de mémoire supplémentaire. (En fait, tout ce dont vous avez besoin est de mémoire supplémentaire suffisante pour contenir un élément du tableau, à des fins d'échange, plus un booléen ou deux et une variable de boucle ou deux).

Ok, d'un point de vue technique, il se peut que le heapsort soit généralement expliqué comme utilisant un tas séparé, mais il est parfaitement possible de l'implémenter en place.

Peter Taylor
la source
3
Le seul endroit où je m'attendrais à voir "heapsort" avec un segment séparé (dans le code) est dans un langage fonctionnel comme Haskell, pour la même raison que le "Quicksort" fonctionnel habituel n'est pas en place aussi - des programmeurs fonctionnels comme leurs listes beaucoup, et un tri sur place est avec état - il change l'état du tableau / tout ce qui contient les données. Citations effrayantes parce que je n'accepte pas vraiment qu'un tri rapide hors site soit un tri rapide du tout, ou qu'un tas hors site soit un tas de mémoire du tout - du moins pas sans dire clairement qu'il n'est pas en endroit.
Steve314
1
@ Steve314, je pense que j'ai vu du matériel pédagogique qui dit quelque chose comme "mettez-le en tas, puis retirez les éléments un par un et mettez-les dans un tableau". Mais après avoir vérifié CLR, je peux signaler qu'ils montrent une version sur place.
Peter Taylor
2
@PeterTaylor: Oui, le livre que je commentais (Skiena) présentait un tas en créant un tas supplémentaire.
user10326
4

Il se peut que vous manquiez la compréhension fondamentale qu'un tableau peut être utilisé pour spécifier la disposition d'une arborescence.

Supposons que vous ayez un arbre binaire et qu'un nœud intérieur se trouve à l'index i du tableau. Ensuite, l'index du tableau du parent et des enfants de ce nœud peut être trouvé par:

Parent(i) = floor(i/2)
Left child(i) = 2i
Right child(i) = 2i + 1

Voir:

http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm

Étant donné que le tas peut être conservé et organisé entièrement dans un tableau, le heapsort peut s'exécuter sur place en déplaçant des éléments à l'intérieur du tableau d'entrée. En effet, le tas est construit et manipulé à l'aide du tableau d'entrée d'origine.

stackoverflowuser2010
la source
: Je sais à ce sujet.Le problème semble être que le livre que je lis présentait un tas en utilisant un tas séparé.Je ne comprenais pas ou ne pensais pas que cette présentation devait faciliter la compréhension de l'algorithme (peut-être? Je ne sais pas pourquoi il était présenté comme ça)
user10326
Je vous recommande fortement d'acheter le livre "Introduction to Algorithms" de Cormen, et al. Il répond clairement à toutes les questions liées aux algorithmes. Si vous êtes sérieux au sujet d'une carrière en tant qu'informaticien ou ingénieur logiciel, alors vous devez avoir ce livre.
stackoverflowuser2010
1

Si, comme vous le dites, il fallait vraiment une structure supplémentaire pour construire le tas, alors heapsort ne serait en effet PAS un algorithme de tri sur place.

Cependant, ce n'est pas le cas. Vous pouvez créer le tas sur le même tableau que vous souhaitez trier, et après cela, vous appliquez l'algorithme heapsort, afin qu'il trie sur place.

Daniel Scocco
la source
Fondamentalement, il existe un algorithme "heapify" qui est utilisé pour réorganiser les données dans un tableau afin qu'il soit conforme aux règles d'un tas en temps IIRC O (n). Voir le pseudocode sur programmers.stackexchange.com/questions/116904/… . Après cela, il s'agit principalement de faire des extraits de racine de tas répétés et de garder une trace de la quantité de tableau qui est encore "tas" et de la quantité triée du résultat final.
Steve314
0

En informatique, un algorithme sur place (ou en latin in situ) est un algorithme qui transforme les entrées à l'aide d'une structure de données avec une petite quantité constante d'espace de stockage supplémentaire. L'entrée est généralement remplacée par la sortie lors de l'exécution de l'algorithme. Un algorithme qui n'est pas en place est parfois appelé non en place ou hors place.

Wikipedia - Algorithme sur place

Rein Henrichs
la source
Alors, pourquoi mergesort est alors considéré comme un algorithme non en place?
user10326
3
Ce n'est pas une réponse utile. Cela n'a rien à voir avec le heapsort et ne répond pas à la question.
stackoverflowuser2010
Bien sûr, cela a quelque chose à voir avec le tas. Heapsort est un algorithme de tri sur place, comme cela devrait être clair d'après la définition. En fait, il était lié depuis la page heapsort.
Rein Henrichs
0

Il est considéré comme étant en place car ses exigences d'espace sont négligeables (constantes ou nulles du tout si vous utilisez des opérations au niveau du bit pour échanger des éléments). MergeSort, par exemple, n'est pas en place car le jeu d'entrée n'est pas modifié à chaque itération de l'exemple de recherche.

La meilleure façon d'illustrer les différences entre les algorithmes en place et les algorithmes hors lieu est probablement de regarder le code d'inversion de chaîne C / C ++ suivant qui le fait en place (de K&R):

void reverse(char s[])
{
      int c, i, j;

      for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
      }
}

Si vous lisiez, par exemple, la chaîne d'entrée depuis la fin et placiez les caractères dans un autre tampon, ce serait un algorithme d'inversion de chaîne hors de propos.

rdasxy
la source
1
Mergesort est sacrément ennuyeux - il est facile de se convaincre à tort que vous avez une stratégie en place. Habituellement, cela ne fonctionne que pour les petits tableaux. Cependant, je pense avoir téléchargé un article une fois où quelqu'un a travaillé sur une variante en place de l'algorithme de fusion-tri. Je vais voir si je peux le retrouver.
Steve314