Prouver un tas binaire a

16

J'essaie de prouver qu'un tas binaire avec nœuds a exactement , étant donné que le tas est construit de la manière suivante:nn2

Chaque nouveau nœud est inséré via percoler vers le haut . Cela signifie que chaque nouveau nœud doit être créé au prochain enfant disponible. Ce que je veux dire par là, c'est que les enfants sont remplis de haut en bas et de gauche à droite. Par exemple, le segment de mémoire suivant:

    0
   / \
  1   2

aurait être construit dans cet ordre: 0, 1, 2. (Les nombres ne sont que des index, ils ne donnent aucune indication sur les données réelles contenues dans ce nœud.)

Cela a deux conséquences importantes:

  1. Il ne peut exister de nœud au niveau sans que le niveau soit complètement remplik+1k

  2. Parce que les enfants sont construits de gauche à droite, il ne peut y avoir aucun "espace vide" entre les nœuds au niveau , ou des situations comme les suivantes: k+1

        0
       / \
      1   2
     / \   \
    3  4    6
    

(Ce serait un tas illégal selon ma définition.) Ainsi, une bonne façon de penser à ce tas est une implémentation de tableau d'un tas, où il ne peut pas y avoir de "sauts" dans les indéces du tableau.

Donc, je pensais que l'induction serait probablement un bon moyen de le faire ... Peut-être quelque chose devant traiter même des cas étranges pour n. Par exemple, une induction utilisant le fait que même les tas construits de cette façon doivent avoir un nœud interne avec un enfant pour un n pair, et aucun de ces nœuds pour un n impair. Des idées?

varatis
la source
@DaveClarke: Pas tout à fait; la question liée est le résultat d'un malentendu sur les parties des éditeurs américains laissés là pour référence.
Raphael
Avez-vous essayé l' induction sur le numéro de nœud resp. nombre d'insertions?
Raphael
@DaveClarke: Pourquoi? C'est une question valable en soi, à mon humble avis.
Raphael
BTW, la question n'a rien à voir avec des tas. La réclamation est valable pour tout arbre binaire complet
Ran G.

Réponses:

8

Si je comprends bien votre question, le tas obtenu n'est qu'un arbre binaire ordonné, où dans l'ordre je veux dire que le ème niveau ne peut être occupé qu'après que le niveau k - 1 a été complètement rempli, et chaque niveau est occupé de gauche à droite, sans sauter.kk1

Ensuite, la preuve va comme ça.

  1. Un arbre parfait de profondeur a exactement 2 k + 1 - 1 nœuds.k2k+11
  2. Supposons que le tas atteint la profondeur . Donc k
    1. jusqu'au niveau l'arbre est parfait (et contient 2 k - 1 nœuds)k12k1
    2. au dernier niveau, il y a exactement nœuds, qui sont tous des feuilles.n2k+1
  3. Chaque feuille du ème niveau a un parent. De plus, chacun des deux congés consécutifs a le même père (peut-être à l'exception du dernier nœud, dont le père n'a qu'un enfant)k
  4. Ainsi, sur les nœuds au niveau k - 1 , n - 2 k + 12k1k1sont parents, et le reste2k-1-n-2 k +1n2k+12sont des feuilles.2k1n2k+12
  5. La quantité totale de feuilles est qui vous donne ce que vous avez besoin.
    n2k+1+2k1n2k+12
A sonné.
la source
1
Notez que full sont différents de complete sont différents des arbres binaires parfaits . Choix de mots malheureux, ambigu et incohérent, mais que pouvez-vous faire à ce sujet. Je suppose que s'en tenir à la définition de Wikipédia est logique, car la plupart y regarderont en premier?
Raphael
Oh, wow, je ne connaissais même pas ces termes. Merci de l'avoir signalé.
Ran G.28
"jusqu'au niveau k − 1, l'arbre est parfait (et contient 2 ^ k - 1 nœuds)" et "Ainsi, sur les 2 ^ (k − 1) nœuds au niveau k − 1" semblent être des déclarations contradictoires, ou est-ce que je manque quelque chose?
adrian h.
2k12k12k1+2k2+...
Ah vous avez tout à fait raison, merci beaucoup pour la clarification!
adrian h.
11

Voici une preuve logique plus simple.

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

(n/2)(n/2)

Zubin Pahuja
la source
1
Explication assez intuitive et claire. Merci.
whitehat