J'essaye de mettre en application l'algorithme de Dijsktra du livre CLRS - Introduction aux algorithmes, cependant, j'ai de la difficulté à implémenter une file d'attente prioritaire avec l'interface Comparator
. C'est ma classe de Vertex comme vous pouvez le voir;Implémentation d'une classe de comparaison pour la file d'attente prioritaire utilisée dans l'algorithme de Dijkstra?
public class Vertex {
public boolean explored;
public int vertexID;
public LinkedList<Vertex> adjacencyList;
public LinkedList<Edge> edgeSet;
public int shortestDistance;
public Vertex predecessor;
public Vertex(int vertexID){
this.vertexID = vertexID;
this.explored = false;
this.adjacencyList = new LinkedList<>();
this.edgeSet = new LinkedList<>();
this.shortestDistance = Integer.MAX_VALUE;
this.predecessor = null;
}
}
donc d'abord shortestDistance
attribut est déclaré Integer.MAX_VALUE
. De plus, vous pouvez voir la classe qui implémente depuis Comparator, est utilisée pour la file d'attente prioritaire.
public class WeightComparator implements Comparator<Vertex> {
@Override
public int compare(Vertex o1, Vertex o2) {
return Math.min(o1.shortestDistance, o2.shortestDistance);
}
}
Je suis sûr que la mise en œuvre tout n'a pas d'erreurs logiques en raison de mes quelques tests, cependant, dans certains tests, il échoue. Je crée une référence à ma file d'attente avec cette déclaration
PriorityQueue<Vertex> queue = new PriorityQueue<>(N, weightComparator);
où N est la taille de la file d'attente. Alors s'il vous plaît corrigez-moi si je me trompe sur la façon dont cela fonctionne. Lorsque vous en aurez un article, il supprimera l'article qui a le moins de priorité? J'espère qu'il a été clair pour comprendre mon problème, et j'apprécierai beaucoup si quelqu'un peut aider à ce sujet. Donc, merci quand même
Votre problème est que vous n'êtes pas mise en œuvre 'Comparator.compare' correctement. Lisez le Javadoc pour 'Comparator'. –
J'ai implémenté la méthode 'compare' avec 3 trois cas que javadoc dit' Compare ses deux arguments pour l'ordre. Renvoie un entier négatif, zéro ou un entier positif car le premier argument est inférieur, égal ou supérieur au second. », Cependant, cela ne fonctionne pas correctement. La raison pourrait être la gamme de priorités qu'il y aura des milliers de rangs prioritaires au lieu de -1,0,1? – quartaela
Est-ce ce que vous avez fait? Ce n'est pas ce à quoi cela ressemble depuis votre implémentation en utilisant 'Math.min'. –