Illustrazione delle strutture di dati heap
Esistono due tipi di cumuli: un heap massimo e un minimo. Una struttura massima-heap è dove il valore massimo è la radice e i valori diventano più piccoli man mano che l'albero scende; Qualsiasi genitore è pari o più grande di valore rispetto ai suoi figli immediati. Una struttura a taglio minimo è dove il valore minimo è la radice e i valori diventano più grandi man mano che l'albero scende; Qualsiasi genitore è pari o inferiore di valore rispetto a uno dei suoi figli immediati. Nei seguenti diagrammi, il primo è un heap massimo e il secondo è un minimo:
Per entrambi i cumuli, nota che per una coppia di bambini, non importa se quello a sinistra sia il valore maggiore. Una riga in un livello nell'albero, non deve necessariamente essere riempita dal minimo al massimo, da sinistra; non è anche necessariamente riempito dal massimo al minimo, da sinistra.
Che rappresenta un mucchio in un array
Affinché il software possa utilizzare facilmente un heap, il mucchio deve essere rappresentato in un array. Il capannone massimo sopra, rappresentato in un array è:
89, 85, 87, 84, 82, 79, 73, 80, 81 ,,, 65, 69Questo viene fatto a partire dal valore principale come primo valore per l'array. I valori vengono continuamente posizionati leggendo l'albero da sinistra a destra, dall'alto verso il basso. Se un elemento è assente, la sua posizione nell'array viene saltata. Ogni nodo ha due figli. Se un nodo è a indice (posizione) n, il suo primo figlio nell'array è all'indice 2n+1 e il suo bambino successivo è all'indice 2n+2. 89 è all'indice 0; Il suo primo figlio, 85 è all'indice 2 (0)+1 = 1 mentre il suo secondo figlio è all'indice 2 (0)+2 = 2. 85 è all'indice 1; Il suo primo figlio, 84, è all'indice 2 (1)+1 = 3 mentre il suo secondo figlio, 82 è all'indice 2 (1)+2 = 4. 79 è all'indice 5; Il suo primo figlio, 65 è all'indice 2 (5)+1 = 11 mentre il suo secondo figlio è all'indice 2 (5)+2 = 12. Le formule vengono applicate al resto degli elementi nell'array.
Tale array, in cui il significato di un elemento e la relazione tra gli elementi, è implicito dalla posizione dell'elemento, è chiamato una struttura di dati implicita.
La struttura dei dati implicita per il minimo sopra è:
65, 68, 70, 73, 71, 83, 84 ,,, 79, 80 ,,, 85, 89Il massimo sopra è un albero binario completo ma non un albero binario completo. Ecco perché alcune posizioni (posizioni) sono vuote nell'array. Per un albero binario completo, nessuna posizione sarà vuota nell'array.
Ora, se il mucchio fosse un albero quasi completo, ad esempio, se mancava il valore 82, allora l'array sarebbe:
89, 85, 87, 84 ,, 79, 73, 80, 81 ,,, 65, 69In questa situazione, tre posizioni sono vuote. Tuttavia, le formule sono ancora applicabili.
Operazioni
Una struttura di dati è un formato di dati (e.G. un albero), oltre alla relazione tra i valori, più le operazioni (funzioni) funzionano sui valori. Per un mucchio, la relazione che attraversa l'intero mucchio è che il genitore deve essere uguale o maggiore di valore rispetto ai bambini, per un heap massimo; e il genitore deve essere uguale o meno valore rispetto ai bambini, per un minimo. Questa relazione è chiamata proprietà heap. Le operazioni di un mucchio sono raggruppate sotto i titoli della creazione, di base, interna e di ispezione. Segue un riassunto delle operazioni del heap:
Riepilogo delle operazioni di heap
Esistono alcune operazioni software che sono comuni con i cumuli, come segue:
Creazione di un mucchio
create_heap: creare un heap significa formare un oggetto che rappresenta il mucchio. Nel linguaggio C, è possibile creare un heap con il tipo di oggetto struct. Uno dei membri della struttura sarà l'array di heap. Il resto dei membri sarà funzioni (operazioni) per il mucchio. Create_heap significa creare un mucchio vuoto.
Heapify: l'array heap è un array parzialmente ordinato (ordinato). MEVIFICI DI HAPIFICA, fornire un array di heap da un array non desiderato - vedere i dettagli di seguito.
Unisci: questo significa, forma un cumulo di unione da due diversi cumuli: vedere i dettagli di seguito. I due cumuli dovrebbero essere entrambi heap massimo o entrambi i ministri. Il nuovo heap è conforme alla proprietà del heap, mentre i cumuli originali sono conservati (non cancellati).
Meld: questo significa. Il nuovo heap è in conformità con la proprietà del heap, mentre i cumuli originali vengono distrutti (cancellati). La differenza principale tra fusione e fusione è, che per la fusione, un albero si adatta a una sottostruttura alla radice dell'altro albero, consentendo valori duplicati nel nuovo albero, mentre per la fusione si forma un nuovo albero del mucchio, rimuovendo i duplicati. Non è necessario mantenere i due cumuli originali con la fusione.
Operazioni di heap di base
find_max (find_min): individuare il valore massimo nell'array massimo-heap e restituire una copia o individuare il valore minimo nell'array min-heap e restituire una copia.
Inserisci: aggiungi un nuovo elemento all'array heap e riorganizza l'array in modo che la proprietà heap del diagramma venga mantenuta.
estratto_max (estratto_min): individuare il valore massimo nell'array massimo-heap, rimuoverlo e restituirlo; o individuare il valore minimo nell'array min-heap, rimuoverlo e restituirlo.
delete_max (delete_min): individuare il nodo radice di un heap massimo, che è il primo elemento dell'array massimo-heap, rimuoverlo senza necessariamente restituirlo; o individuare il nodo radicale di un minimo, che è il primo elemento dell'array min-heap, rimuoverlo senza necessariamente restituirlo;
Sostituire: individuare il nodo radice di entrambi i heap, rimuoverlo e sostituirlo con uno nuovo. Non importa se la vecchia radice viene restituita.
Operazioni di heap interno
Aumin.
Elimina: elimina qualsiasi nodo, quindi riorganizza, in modo che la proprietà heap venga mantenuta per il heap massimo o un minimo.
Shift_up: sposta un nodo in un max heap o min-heap per tutto il tempo necessario, riorganizzando per mantenere la proprietà heap.
Shift_Down: sposta un nodo verso il basso in un heap massimo o un minuto per il tempo necessario, riorganizzando per mantenere la proprietà heap.
Ispezione di un mucchio
Misurare: Questo restituisce il numero di chiavi (valori) in un mucchio; Non include le posizioni vuote dell'array di heap. Un heap può essere rappresentato dal codice, come nel diagramma o con un array.
è vuoto: Questo restituisce vero booleano se non c'è nodo in un heap o falso booleano se il mucchio ha almeno un nodo.
Setacciare in un mucchio
C'è setacciatura e setaccia:
Setacciatura: Questo significa scambiare un nodo con il suo genitore. Se la proprietà heap non è soddisfatta, scambia il genitore con il proprio genitore. Continua in questo modo sul percorso fino a quando la proprietà heap non è soddisfatta. La procedura potrebbe raggiungere la radice.
Setacciatura: Ciò significa scambiare un nodo di grande valore con il più piccolo dei suoi due figli (o un bambino per un mucchio quasi completo). Se la proprietà heap non è soddisfatta, scambia il nodo inferiore con il nodo più piccolo dei suoi due figli. Continua in questo modo sul percorso fino a quando la proprietà heap non è soddisfatta. La procedura potrebbe raggiungere una foglia.
Accumulare
HeaPify significa ordinare un array non desiderato per avere la proprietà heap soddisfatta per max heap o min-heap. Ciò significa che potrebbero esserci alcune posizioni vuote nel nuovo array. L'algoritmo di base per accumulare un heap massimo o min-heap è il seguente:
- Se il nodo radice è più estremo di uno dei nodi del suo figlio, quindi scambia la radice con il nodo figlio meno estremo.
- Ripeti questo passaggio con i nodi per bambini in uno schema di attraversamento dell'albero pre-ordine.
L'albero finale è un albero di heap che soddisfa la proprietà. Un mucchio può essere rappresentato come un diagramma dell'albero o in un array. Il mucchio risultante è un albero parzialmente ordinato, io.e. Un array parzialmente ordinato.
Dettagli dell'operazione heap
Questa sezione dell'articolo fornisce i dettagli delle operazioni di heap.
Creazione di dettagli di heap
create_heap
Vedi sopra!
accumulare
Vedi sopra
unire
Se gli array di heap,
89, 85, 87, 84, 82, 79, 73, 80, 81 ,,, 65, 69E
89, 85, 84, 73, 79, 80, 83, 65, 68, 70, 71sono uniti, il risultato senza duplicati può essere,
89, 85, 87, 84, 82, 83, 81, 80, 79 ,, 73, 68, 65, 69, 70, 71Dopo un po 'di setacciatura. Si noti che nel primo array, 82 non ha figli. Nell'array risultante, è all'indice 4; e le sue posizioni all'indice 2 (4)+1 = 9 e 2 (4)+2 = 10 sono vacanti. Ciò significa che inoltre non ha figli nel nuovo diagramma degli alberi. I due cumuli originali non devono essere eliminati poiché le loro informazioni non sono proprio nel nuovo heap (nuovo array). L'algoritmo di base per unire i cumuli dello stesso tipo è seguente:
- Unisciti a un array in fondo all'altro array.
- Heapify sta eliminando i duplicati, assicurandosi che i nodi che non avevano figli nel cumulo originale, non abbiano ancora figli nel nuovo mucchio.
Meld
L'algoritmo per fondere due cumuli dello stesso tipo (due o due minimi) è il seguente:
- Confronta i due nodi radicali.
- Rendi la radice meno estrema e il resto del suo albero (sottostruttura), il secondo figlio della radice estrema.
- Setacciare il figlio randagio della radice di ora la sottostruttura estrema, verso il basso nella sottostruttura estrema.
Il heap risultante è ancora conforme alla proprietà del heap, mentre i cumuli originali vengono distrutti (cancellati). I cumuli originali possono essere distrutti perché tutte le informazioni che possedevano sono ancora nel nuovo mucchio.
Operazioni di heap di base
find_max (find_min)
Ciò significa individuare il valore massimo nell'array massimo e restituire una copia o individuare il valore minimo nell'array min-heap e restituire una copia. Un array di heap per definizione soddisfa già la proprietà heap. Quindi, restituisci una copia del primo elemento dell'array.
inserire
Ciò significa aggiungere un nuovo elemento all'array heap e riorganizzare l'array in modo che la proprietà heap del diagramma sia mantenuta (soddisfatta). L'algoritmo per farlo per entrambi i tipi di cumuli è il seguente:
- Assumi un albero binario completo. Ciò significa che l'array deve essere riempito alla fine con posizioni vuote, se necessario. Il numero totale di nodi di un heap completo è 1 o 3 o 7 o 15 o 31, ecc.; Continua a raddoppiare e aggiungendo 1.
- Metti il nodo nella posizione vuota più adatta per grandezza, verso l'estremità del mucchio (verso l'estremità dell'array di heap). Se non c'è una posizione vuota, inizia una nuova riga dal basso a sinistra.
- Setacciare se necessario, fino a quando la proprietà heap non è soddisfatta.
extract_max (extract_min)
Individua il valore massimo nell'array massimo, rimuoverlo e restituirlo; o individuare il valore minimo nell'array min-heap, rimuoverlo e restituirlo. L'algoritmo a Extract_max (extract_min) è il seguente:
- Rimuovi il nodo radice.
- Prendi (rimuovi) il nodo più in basso a destra (ultimo nodo nell'array) e posiziona sulla radice.
- Setacciare il punto appropriato, fino a quando la proprietà heap non è soddisfatta.
delete_max (delete_min)
Individua il nodo radice di un heap massimo, che è il primo elemento dell'array massimo-heap, rimuoverlo senza necessariamente restituirlo; o individuare il nodo radicale di un minimo, che è il primo elemento dell'array min-heap, rimuoverlo senza necessariamente restituirlo. L'algoritmo per eliminare il nodo radice è il seguente:
- Rimuovi il nodo radice.
- Prendi (rimuovi) il nodo più in basso a destra (ultimo nodo nell'array) e posiziona sulla radice.
- Setacciare il punto appropriato, fino a quando la proprietà heap non è soddisfatta.
sostituire
Individua il nodo radice di entrambi i heap, rimuoverlo e sostituirlo con quello nuovo. Non importa se la vecchia radice viene restituita. Setacciare se appropriato, fino a quando la proprietà heap non è soddisfatta.
Operazioni di heap interno
aumento_key (diminuzioni_key)
Aumenta il valore di qualsiasi nodo per un heap massimo e un riorganizzazione in modo che la proprietà heap venga mantenuta o diminuisci il valore di qualsiasi nodo per un minuto e un retrorange in modo che la proprietà heap sia mantenuta. Setacciare o giù come appropriato, fino a quando la proprietà heap non è soddisfatta.
eliminare
Rimuovere il nodo di interesse, quindi riorganizzare, in modo che la proprietà heap sia mantenuta per il massimo o un minimo. L'algoritmo per eliminare un nodo è il seguente:
- Rimuovi il nodo di interesse.
- Prendi (rimuovi) il nodo più in basso a destra (ultimo nodo nell'array) e posiziona l'indice del nodo rimosso. Se il nodo eliminato è all'ultima riga, questo potrebbe non essere necessario.
- Setacciare o giù come appropriato, fino a quando la proprietà heap non è soddisfatta.
Shift_up
Spostare un nodo in un max heap o un minuto per tutto il tempo necessario, riorganizzando per mantenere la proprietà del mucchio-setaccia.
Shift_Down
Spostare un nodo verso il basso in un heap massimo o un minuto per tutto il tempo necessario, riorganizzando per mantenere la proprietà del mucchio: setacciare.
Ispezione di un mucchio
misurare
Vedi sopra!
è vuoto
Vedi sopra!
Altre classi di cumuli
L'heap descritto in questo articolo può essere considerato come il mucchio principale (generale). Ci sono altre classi di cumuli. Tuttavia, i due che dovresti sapere oltre questo sono il mucchio binario e il mucchio D-ary.
Mucchio binario
Il mucchio binario è simile a questo mucchio principale, ma con più vincoli. In particolare, il mucchio binario deve essere un albero completo. Non confondere tra un albero completo e un albero completo.
d-ary heap
Un mucchio binario è un mucchio di 2. Un mucchio in cui ogni nodo ha 3 bambini è un mucchio di 3. Un mucchio in cui ogni nodo ha 4 bambini è un mucchio di 4 arti e così via. Un heap D-ary ha altri vincoli.
Conclusione
Un heap è un albero binario completo o quasi completo, che soddisfa la proprietà del heap. La proprietà HEAP ha 2 alternative: per un heap massimo, un genitore deve avere un valore uguale o maggiore rispetto ai bambini immediati; Per un minimo, un genitore deve essere uguale o inferiore rispetto ai bambini immediati. Un mucchio può essere rappresentato come un albero o in un array. Se rappresentato in un array, il nodo radice è il primo nodo dell'array; e se un nodo è all'indice n, il suo primo figlio nell'array è all'indice 2n+1 e il suo bambino successivo è all'indice 2n+2. Un heap ha alcune operazioni che vengono eseguite sull'array.
Chrys