Dimostrando un heap binario ha


16

Sto cercando di dimostrare che un heap binario con n nodi ha esattamente n2foglie, dato che l'heap è costruito nel modo seguente:

Ogni nuovo nodo viene inserito tramite percolate up . Ciò significa che ogni nuovo nodo deve essere creato al successivo figlio disponibile. Ciò che intendo con questo è che i bambini sono riempiti di livello inferiore e da sinistra a destra. Ad esempio, il seguente heap:

    0
   / \
  1   2

avrebbe dovuto essere costruito in questo ordine: 0, 1, 2. (I numeri sono solo indici, non danno alcuna indicazione dei dati effettivi contenuti in quel nodo.)

Ciò ha due importanti implicazioni:

  1. Non può esistere alcun nodo al livello k+1 senza il livello k completamente riempito

  2. Poiché i bambini sono costruiti da sinistra a destra, non possono esserci "spazi vuoti" tra i nodi al livello o situazioni come le seguenti: k+1

        0
       / \
      1   2
     / \   \
    3  4    6
    

(Questo sarebbe un heap illegale secondo la mia definizione.) Pertanto, un buon modo di pensare a questo heap è un'implementazione di array di un heap, in cui non ci possono essere "salti" tra gli indici dell'array.

Quindi, stavo pensando che l'induzione sarebbe probabilmente un buon modo per farlo ... Forse qualcosa che deve affrontare anche casi strani per n. Ad esempio, alcune induzioni si basano sul fatto che anche cumuli costruiti in questo modo devono avere un nodo interno con un figlio per un numero pari e nessun nodo per un numero dispari. Idee?


@DaveClarke: non proprio; la domanda collegata è il risultato di un malinteso sulle parti di noi editori lasciate lì come riferimento.
Raffaello

Hai provato a induzione sul numero di nodo resp. numero di inserimenti?
Raffaello

@DaveClarke: Perché? È una domanda valida in sé, imho.
Raffaello

A proposito, la domanda non ha nulla a che fare con i cumuli. Il reclamo vale per qualsiasi albero binario completo
Ran G.

Risposte:


8

Se ricevo correttamente la tua domanda, l'heap ottenuto è solo un albero binario ordinato, dove in ordine intendo che il ° livello può essere occupato solo dopo il k - 1kk1 livello è stato completamente riempito e ogni livello è occupato da sinistra a destra, senza saltare.

Quindi la prova va così.

  1. Un albero perfetto di profondità ha esattamente 2 k + 1 - 1k2k+11 nodi.
  2. Supponiamo che l'heap raggiunga la profondità k . così
    1. fino al livello l'albero è perfetto (e ha 2 k - 1 nodi lì)k12k1
    2. all'ultimo livello, ci sono esattamente nodi, che sono tutti foglie.n2k+1
  3. Ogni foglia al livello ha un genitore. Inoltre, ogni due foglie consecutive hanno lo stesso padre (forse tranne l'ultimo nodo, il cui padre ha un solo figlio)k
  4. Pertanto, tra i nodi a livello k - 1 , n - 2 k + 12k1k1sono genitori e il resto2k-1-n-2 k +1n2k+12sono foglie.2k1n2k+12
  5. La quantità totale di foglie è Che ti dà ciò di cui hai bisogno.
    n2k+1+2k1n2k+12

1
Si noti che full sono diversi da complete sono diversi dagli alberi binari perfetti . Scelta delle parole sfortunata, ambigua e incoerente lì, ma cosa puoi fare al riguardo. Immagino che attenersi alla definizione di Wikipedia abbia senso, come la maggior parte guarderà prima lì?
Raffaello

Oh, wow, non conoscevo nemmeno questi termini. Grazie per averlo segnalato.
Ran G.

"fino al livello k − 1 l'albero è perfetto (e contiene 2 ^ k - 1 nodi lì)" e "Quindi, su 2 ^ (k − 1) nodi al livello k − 1" sembrano essere dichiarazioni contrastanti, Oppure mi sfugge qualcosa?
adrian h.

2k12k12k1+2k2+...

Ah hai perfettamente ragione, grazie mille per il chiarimento!
adrian h.

11

Ecco una prova logica più semplice.

nthn/2n/2+1)thn/2 +1 a n.

(n/2)(n/2)


1
Spiegazione abbastanza intuitiva e chiara. Grazie.
Whitehat
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.