2009-08-30 6 views
2

J'ai travaillé sur une implémentation Fibonacci Heap en Java depuis environ une semaine maintenant. C'est la mise en œuvre basée sur le livre CLRS. Je voulais voir si j'aurais une amélioration des performances en l'utilisant dans un projet parallèle sur lequel je travaille par rapport à PriorityQueue par défaut de Java. [L'implémentation par défaut dans Java est basée sur un tableau, beaucoup plus locale. Il peut encore surperformer le F-Heap malgré des limites plus élevées en complexité].Fibonacci Heap Issue

Mon problème semble provenir de la consolidation de la partie du tas après la suppression de l'élément min. Je n'arrête pas de lancer arrayindexofofboundsexceptions. Spécifiquement dans la boucle while, quand elle consolide tous les nœuds ayant le même degré. Il dépasse les limites définies par la fonction D(). Donc, soit ma fonction D() est fausse, ce qui, je ne le pense pas, ou quelque chose d'autre se passe. Effet secondaire le plus probable lié.

Le code est situé here. J'ai essayé de déboguer cela pendant environ une semaine avec maintenant de la chance. Est-ce que je manque quelque chose d'évident?

Répondre

1

Vous devrez vérifier l'analyse car je ne suis pas sûr si la limite supérieure du degré de nœud ne devrait pas être l'étage. Dans votre fonction D, votre conversion en int tronque la partie décimale. Changer cela pour arrondir semble éclaircir l'erreur hors limites de l'index.

Il semble cependant y avoir un problème supplémentaire. Je n'ai pas retrouvé les conditions mais les listes d'enfants peuvent finir par ne pas avoir un ensemble sentinelle. Cela conduit à une boucle infinie dans removeMin lors de la boucle de la liste des enfants, car ils sont circulaires.