2010-04-21 11 views
1

J'essaie d'extraire le minimum d'un tas binaire, mais ça ne fonctionne pas. Voici mon code BubbleDown:Opération BubbleDown sur min-heap binaire ne fonctionne pas

void heapBubbleDown(Heap * const heap, int idx) { 
    int min; 

    while(RIGHT(idx) < heap->count) { 
     min = LEFT(idx); 

     if(RIGHT(idx) < heap->count) { 
      if(heap->items[LEFT(idx)] > heap->items[RIGHT(idx)]) { 
       min = RIGHT(idx); 
      } 
     } 

     heapSwapValue(&(heap->items[idx]), &(heap->items[min])); 

     idx = min; 
    } 
} 

On dirait qu'il permute seulement quelques chiffres, mais pas tous, je ne comprends pas pourquoi. J'ai essayé de le recoder différemment et plusieurs fois déjà ...

Qu'est-ce que je fais mal?

Répondre

2

Je ne pense pas que le problème est qu'il permute peu d'éléments. Vous devez vous arrêter lorsque le plus petit enfant> = élément actuel.

Je réécrire les deux dernières lignes:

if (heap->items[idx] > heap->items[min]) { 
     heapSwapValue(&(heap->items[idx]), &(heap->items[min])); 
     idx = min; 
    } 
    else 
     break; 
} 
+0

Merci ... Je n'aime pas utiliser les pauses, je pense à ajouter une variable à la condition while, mais y a-t-il un autre moyen? Je ne peux pas penser à tout ... –

+0

@Nazgul, pas facile. Vous devez faire tous les trucs gauche/droite avant de pouvoir savoir. Vous pouvez garder un drapeau booléen 'noptInOrderYet', mais j'utiliserais une pause. –

+0

Je préfère ne pas utiliser une pause, mais merci pour la perspicacité. –

2

L'état du tout ne suffit pas. Il se peut qu'il n'y ait pas de bon enfant mais que vous ayez besoin d'échanger avec l'enfant de gauche. De plus, comme le suggère Henk, vous devez vérifier si le minimum calculé est en fait plus petit que votre valeur actuelle.

+0

tafa, oui, j'ai raté ça. Il devrait être 'while (LEFT (idx) < heap-> compte)' –