Index
Related
Introduzione
La heap è una struttura dati alternativa alla lista che permette di eseguire operazione di inserimento e estrazione in modo più efficiente.
Costi
Heap Lista non ordinata Lista ordinata Creazione: θ(n)
Creazione: O(1)
Creazione: θ(n log n)
Inserimento: O(log n)
Inserimento: O(1)
Inserimento: O(n)
Estrazione minimo: O(log n)
Estrazione minimo: θ(n)
Estrazione minimo: O(1)
Funzioni Python
Importare Modulo:
from heapq import heapfy, heappush, heappoo
- Creazione:
heapfy()
- Inserimento:
heappush()
- Estrazione minimo:
heappop()
Implementazione
Un normale array ordinato utilizza un ordinamento orizzontale del tipo [1, 2 , 5, 9, 11]
, dove passare da un array non ordinato ad uno ordinato ha costo .
Un Heap utilizza un ordinamento verticale del tipo [0 ,1 ,3 ,2 ,4 ,5 ,7 ,8 ,9]
, dove passare da un array ad una heap ha un costo .
Struttura basata su: Memorizzazione tramite puntatori (Alberi Binari)
Struttura
Rapporto padre figlio
oss: Il valore del nodo padre è sempre più piccolo dei valori nodi dai figli
Operazioni
Una Heap ha 3 operazioni di base:
Creazione (heapfy)
heapify1
Input
A
: Un array di oggetti (su cui sia definito un modo per confrontarli) che verrà trasformato in una Heap.i
: Un indice nell’array. Questo è il nodo che la funzione cercherà di “heapify”. In altre parole, la funzione riorganizzerà l’array in modo che il nodo in posizionei
e tutti i suoi discendenti rispettino la proprietà di heap minimo.Costo Temporale
La funzione
heapify1
ha un costo temporale di O(log n) nel caso peggiore. Questo perché, nel caso peggiore, potrebbe dover scendere lungo l’albero fino alla foglia più lontana, che è a una profondità di log n, dove n è il numero di elementi nell’heap.Costo Spaziale
Il costo spaziale di
heapify1
è O(1), perché non utilizza spazio di memoria aggiuntivo proporzionale alla dimensione dell’input. La funzione opera “in loco”, il che significa che modifica direttamente l’array di input senza creare nuove strutture dati di dimensioni significative. Le uniche variabili che vengono create sonoL
,R
eindice_min
, che occupano uno spazio costante indipendentemente dalla dimensione dell’array.
Heapfy()
Funzionamento
La funzione
Heapify
prende un solo input:
H
: Un array di elementi. Questo è l’array che la funzione trasformerà in un heap minimo.La funzione
Heapify
opera “in loco”, il che significa che modifica direttamente l’array di input senza creare una nuova copia dell’array.Inizia dal nodo più in basso che ha almeno un figlio (che è
(len(H) - 2) // 2
) e risale fino alla radice dell’heap (che è0
), chiamando la funzioneheapify1
su ogni nodo per assicurarsi che quel nodo e tutti i suoi discendenti rispettino la proprietà di heap minimo.Come per la funzione
heapify1
, l’arrayA
può contenere qualsiasi tipo di elementi, purché sia definito un ordinamento per quegli elementi. In pratica,H
è spesso un array di numeri.Costo computazionale (da finire)
heapfy1()
ha costoheapfy()
si ripete volte dove è la lunghezza dell’array- a ogni ripetizione la (da finire)
Estrazione Minimo (heappop)
Funzionamento
La funzione
heappop
rimuove e restituisce l’elemento minimo dell’heapA
. Per fare ciò, salva l’elemento minimo (che è alla radice dell’heap), sostituisce la radice con l’ultimo elemento dell’heap, rimuove l’ultimo elemento (che ora è duplicato), e infine riorganizza l’heap per assicurarsi che rispetti ancora la proprietà di heap minimo.
Input
A
: Un array di oggetti (su cui sia definito un modo per confrontarli) che rappresenta una Heap.
Costo Temporale
La funzione
heappop
ha un costo temporale di O(log n) nel caso peggiore.Questo perché chiama la funzione
heapify1
sulla radice dell’heap, che potrebbe dover scendere lungo l’albero fino alla foglia più lontana, che è a una profondità di log n, dove n è il numero di elementi nell’heap.
Costo Spaziale
Il costo spaziale di
heappop
è O(1), perché non utilizza spazio di memoria aggiuntivo proporzionale alla dimensione dell’input.La funzione opera “in loco”, il che significa che modifica direttamente l’array di input senza creare nuove strutture dati di dimensioni significative. L’unica variabile che viene creata è
x
, che occupa uno spazio costante indipendentemente dalla dimensione dell’array.
Inserimento (heappush)
Funzionamento
La funzione
Heappush
inserisce un nuovo elementox
nell’heapA
. Per fare ciò, aggiungex
alla fine dell’array, quindi continua a scambiarex
con il suo genitore finchéx
non è in una posizione in cui è minore del suo genitore (o fino a quando non raggiunge la radice dell’heap). Questo assicura che l’heap mantenga la proprietà di heap minimo dopo l’inserimento dix
.
Input
A
: Un array di oggetti (su cui sia definito un modo per confrontarli) che rappresenta una Heap.x
: L’oggetto da inserire nell’Heap.
Costo Temporale
La funzione
Heappush
ha un costo temporale di O(log n) nel caso peggiore.Questo perché, nel caso peggiore, potrebbe dover risalire lungo l’albero fino alla radice, che è a una profondità di log n, dove n è il numero di elementi nell’heap.
Costo Spaziale
Il costo spaziale di
Heappush
è O(1), perché non utilizza spazio di memoria aggiuntivo proporzionale alla dimensione dell’input.La funzione opera “in loco”, il che significa che modifica direttamente l’array di input senza creare nuove strutture dati di dimensioni significative. Le uniche variabili che vengono create sono
x
ei
, che occupano uno spazio costante indipendentemente dalla dimensione dell’array.