Un heap , noto anche come coda di priorità, è un tipo di dati astratto. Concettualmente, è un albero binario in cui i figli di ogni nodo sono più piccoli o uguali al nodo stesso. (Supponendo che sia un max-heap.) Quando un elemento viene spinto o scoppiato, l'heap si riorganizza in modo che l'elemento più grande sia il prossimo ad essere spuntato. Può essere facilmente implementato come albero o come matrice.
La tua sfida, se scegli di accettarla, è determinare se un array è un heap valido. Un array è in forma heap se i figli di ogni elemento sono più piccoli o uguali all'elemento stesso. Prendi il seguente array come esempio:
[90, 15, 10, 7, 12, 2]
Davvero, questo è un albero binario organizzato sotto forma di un array. Questo perché ogni elemento ha figli. 90 ha due figli, 15 e 10.
15, 10,
[(90), 7, 12, 2]
15 ha anche figli, 7 e 12:
7, 12,
[90, (15), 10, 2]
10 ha figli:
2
[90, 15, (10), 7, 12, ]
e l'elemento successivo sarebbe anche un figlio di 10, tranne per il fatto che non c'è spazio. 7, 12 e 2 avrebbero anche dei figli se l'array fosse abbastanza lungo. Ecco un altro esempio di heap:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
Ed ecco una visualizzazione dell'albero che l'array precedente fa:
Nel caso in cui questo non sia abbastanza chiaro, ecco la formula esplicita per ottenere i figli dell'i-esimo elemento
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
È necessario prendere una matrice non vuota come input e generare un valore di verità se la matrice è in ordine di heap e un valore di falsa in caso contrario. Può trattarsi di un heap con indicizzazione 0 o di un heap con indicizzazione 1 purché specifichi il formato previsto dal programma / funzione. Si può presumere che tutti gli array conterranno solo numeri interi positivi. Si può non usare alcun heap-comandi incorporati. Questo include, ma non è limitato a
- Funzioni che determinano se un array è in formato heap
- Funzioni che convertono un array in un heap o in un heap-form
- Funzioni che accettano un array come input e restituiscono una struttura di dati heap
È possibile utilizzare questo script Python per verificare se un array è in formato heap o meno (0 indicizzato):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
Test IO:
Tutti questi input dovrebbero restituire True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
E tutti questi input dovrebbero restituire False:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
Come al solito, si tratta di code-golf, quindi si applicano scappatoie standard e vince la risposta più breve in byte!
[3, 2, 1, 1]
?