Aggiornamento algoritmo. Perché heapsort è un algoritmo insort?


15

Non riesco a capire perché l'heapsort sia considerato un algoritmo di ordinamento interno .

Intendo una struttura di dati extra popolata con gli elementi dell'array da ordinare, ovvero un heap, viene utilizzata per aiutare l'estrazione del valore minimo e il processo di ordinamento.

Quindi forse sto fraintendendo la definizione di inplace qui?

Ma l'inserimento in ordine, ad esempio, è ovvio che si tratta di un algoritmo sul posto, cioè non è necessaria memoria aggiuntiva per gli elementi.

Quindi perché è considerato sul posto?

Risposte:


12

Intendo una struttura di dati extra popolata con gli elementi dell'array da ordinare, ovvero un heap, viene utilizzata per aiutare l'estrazione del valore minimo e il processo di ordinamento.

No. L'array viene trasformato per conformarsi al vincolo heap senza utilizzare più di O (1) memoria aggiuntiva. (In effetti tutto ciò che serve è una memoria aggiuntiva sufficiente a contenere un elemento dell'array, a scopo di scambio, più un booleano o due e una variabile o due loop).

Ok, per un tecnicismo può darsi che heapsort sia di solito spiegato come usando un heap separato, ma è perfettamente possibile implementarlo sul posto.


3
L'unico posto in cui mi aspetterei di vedere "heapsort" con un heap separato (nel codice) è in un linguaggio funzionale come Haskell, per lo stesso motivo per cui il solito "Quicksort" funzionale non è al suo posto - programmatori funzionali come le loro liste molto, e un ordinamento sul posto è stateful - cambia lo stato dell'array / qualunque cosa contenga i dati. Citazioni di paura perché non accetto davvero che uno quicksort fuori posto sia un quicksort o che un heapsort fuori posto sia un heapsort - almeno non senza dire chiaramente che non è in posto.
Steve314,

1
@ Steve314, penso di aver visto del materiale didattico che dice qualcosa sull'effetto di "metterlo in un mucchio e poi estrarre gli elementi uno alla volta e metterli in un array". Ma avendo appena verificato CLR posso segnalare che mostrano una versione sul posto.
Peter Taylor,

2
@PeterTaylor: Sì, il libro che stavo recensendo (Skiena) ha presentato heapsort costruendo un mucchio in più.
user10326

4

Potrebbe mancare la comprensione fondamentale che un array può essere utilizzato per specificare il layout di un albero.

Supponiamo di avere un albero binario e che un nodo interno sia nell'indice i dell'array. Quindi l'indice di array del genitore e dei figli di quel nodo può essere trovato da:

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

Vedere:

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

Poiché l'heap può essere mantenuto e organizzato interamente in un array, heapsort può essere eseguito sul posto spostando gli elementi all'interno dell'array di input. In effetti, l'heap viene creato e manipolato utilizzando l'array di input originale.


: Lo so. Il problema sembra essere che il libro che sto leggendo presentava un heapsort usando un heap separato. Non capivo o pensavo che questa presentazione avrebbe reso più semplice la comprensione dell'algoritmo (forse? Non so perché fosse presentato in questo modo)
user10326

Consiglio vivamente di acquistare il libro "Introduzione agli algoritmi" di Cormen, et al. Risponde chiaramente a tutte le domande relative all'algoritmo. Se sei serio riguardo alla carriera di informatico o ingegnere informatico, allora devi avere questo libro.
stackoverflowuser2010,

1

Se, come dici tu, uno avesse davvero bisogno di una struttura extra per costruire l'heap, allora heapsort NON sarebbe un algoritmo di ordinamento sul posto.

Tuttavia, questo non è il caso. È possibile creare l'heap sullo stesso array che si desidera ordinare e, successivamente, applicare l'algoritmo heapsort, in modo che sia ordinato sul posto.


Fondamentalmente, esiste un algoritmo "heapify" che viene utilizzato per riordinare i dati in un array in modo che rispetti le regole di un heap nel tempo IIRC O (n). Vedi lo pseudocodice su programmers.stackexchange.com/questions/116904/… . Successivamente, si tratta principalmente di eseguire ripetuti estratti di radice heap e tenere traccia di quanto l'array è ancora "heap" e di quanto viene ordinato il risultato finale.
Steve314,

0

Nell'informatica, un algoritmo sul posto (o in latino in situ) è un algoritmo che trasforma l'input utilizzando una struttura di dati con una piccola quantità costante di spazio di archiviazione aggiuntivo. L'input viene in genere sovrascritto dall'output durante l'esecuzione dell'algoritmo. Un algoritmo che non è sul posto è talvolta chiamato non sul posto o fuori posto.

Wikipedia - Algoritmo sul posto


Allora perché allora mergesort è considerato un algoritmo non sul posto?
user10326,

3
Questa non è una risposta utile. Non ha nulla a che fare con Heapsort e non risponde alla domanda.
stackoverflowuser2010,

Naturalmente ha qualcosa a che fare con heapsort. Heapsort è un algoritmo di ordinamento sul posto, come dovrebbe essere chiaro dalla definizione. In effetti, era collegato dalla pagina heapsort.
Rein Henrichs,

0

È considerato in atto perché i requisiti di spazio sono trascurabili (costante o nulla se si utilizzano operazioni bit a bit per scambiare elementi). MergeSort, ad esempio, non è attivo perché il set di input non viene modificato in ogni iterazione dell'esempio di ricerca.

Il modo migliore per illustrare le differenze tra algoritmi sul posto e algoritmi fuori posto è probabilmente quello di esaminare il seguente codice di inversione della stringa C / C ++ che lo fa in atto (da 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;
      }
}

Se, ad esempio, leggessi la stringa di input dalla fine e posizionassi i caratteri in un altro buffer, sarebbe un algoritmo di inversione della stringa fuori posto.


1
Mergesort è dannatamente fastidioso: è facile convincersi erroneamente di avere una strategia sul posto. Di solito, funziona solo per piccoli array. Tuttavia, penso di aver scaricato un documento una volta in cui qualcuno ha elaborato una variante sul posto dell'algoritmo di tipo merge. Vedrò se riesco a trovarlo di nuovo.
Steve314,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.