Results 1 to 1 of 1
- 06-24-2011, 05:55 PM #1
Member
- Join Date
- Jun 2011
- Posts
- 3
- Rep Power
- 0
Priority queue: strange behaviour
I'm implementing this priority queue to be used with an implementation of the dijkstra algorithm:
it works pretty well, but strange things happens with the last element I change the priority in dikstra (btw, this is the code)Java Code:package structures; public class PriorityQueue { private Node[] elements; private int lastIndex; /** * Creation of an empty Pq * @param n */ public PriorityQueue(int n) { this.elements = new Node[n+1]; lastIndex = 0; } /** * Determine if the heap is empty * @return true if the heap is empty, false if not */ public boolean isEmpty() { return lastIndex == 0; } /** * Inserts an element into heap * @param n * @param d */ public void add(Node n, double d) { n.setDistance(d); elements[++lastIndex] = n; n.setHeapIndex(lastIndex); moveUp(lastIndex); //FIXME setFathers(); } /** * Returns (and deletes) the node with minimum priority * @return minumum priority node */ public Node deleteMin() { if(lastIndex == 0) throw new IllegalArgumentException(); Node min = elements[1]; if(lastIndex == 1) lastIndex = 0; else { elements[1] = elements[lastIndex--]; elements[1].setHeapIndex(1); moveDown(1); //FIXME setFathers(); } return min; } /** * changes in u the priority of the node u * and ensure the correct position of the node * @param u * @param d */ public void changePriority(Node u, double d) { if(u.getHeapIndex() > lastIndex) throw new IllegalArgumentException(); double oldDist = u.getDistance(); elements[u.getHeapIndex()].setDistance(d); elements[u.getHeapIndex()].setFather(u.getFather()); if (!u.getName().equals(elements[u.getHeapIndex()].getName())) System.err.println("I should change the priority of : " + u.getName()+", instead I'm changin to: " + elements[u.getHeapIndex()].getName()); if(d > oldDist) moveDown(u.getHeapIndex()); else if(d < oldDist) moveUp(u.getHeapIndex()); //FIXME setFathers(); } /** * moveup * @param i */ private void moveUp(int i) { if(i > lastIndex) throw new IllegalArgumentException(); Node elem = elements[i]; while(i > 1 && elem.getDistance() < elements[i/2].getDistance()) { elements[i] = elements[i/2]; elements[i].setHeapIndex(i); i = i/2; } elements[i] = elem; elements[i].setHeapIndex(i); } /** * Movedown * @param i */ private void moveDown(int i) { if(i > lastIndex) throw new IllegalArgumentException(); Node elem = elements[i]; int j; while((j = 2*i) <= lastIndex) { if(j+1 <= lastIndex && elements[j+1].getDistance() < elements[j].getDistance()) j++; if(elem.getDistance() <= elements[j].getDistance()) break; elements[i] = elements[j]; elements[i].setHeapIndex(i); i = j; } elements[i] = elem; elements[i].setHeapIndex(i); } /** * Unused */ @SuppressWarnings("unused") private void setFathers() { for(int i = 1; i <= lastIndex; i++) { if(i == 1) elements[i].setFather(null); else elements[i].setFather(elements[i/2]); } } /** * Prints the heap by levels */ public void printHeap() { int level = 1; System.out.println("HEAP"); for(int i = 1; i <= lastIndex; i++) { if(i == 1) { System.out.println(" " + elements[i].getName() + "(" + elements[i].getDistance() + "::" + elements[i].getHeapIndex() + "::" + elements[i].getFather() + ")"); level++; } else if(i < Math.pow(2, level)) System.out.print(" " + elements[i].getName() + "(" + elements[i].getDistance() + "::" + elements[i].getHeapIndex() + "::" + elements[i].getFather() + ")"); else { System.out.println(); System.out.print(" " + elements[i].getName() + "(" + elements[i].getDistance() + "::" + elements[i].getHeapIndex() + "::" + elements[i].getFather() + ")"); level++; } } System.out.println(); System.out.println("END HEAP"); } /** * returns the node of that index * @param heapIndex * @return nodo di indice heapIndex nello heap */ public Node getNode(int heapIndex) { return elements[heapIndex]; } }
It gives array out of boundary or it changes the priority to a wrong elementJava Code:package algorithm; import java.io.FileOutputStream; import java.io.PrintStream; import auxiliary.Nodes; import structures.Arc; import structures.Graph; import structures.Node; import structures.PriorityQueue; public class Dijkstra { public static Nodes shortestPaths(Node s) { Nodes ns = new Nodes(); FileOutputStream fos; PrintStream file = null; try { fos = new FileOutputStream("output/ourOutput.txt"); file = new PrintStream(fos); } catch(Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } Node workingNode = new Node(); PriorityQueue pq = new PriorityQueue(Graph.getInstance().nodes().size()); for(Node n : Graph.getInstance().nodes()) { if(n.getName().equals(s.getName())) pq.add(n, 0); else pq.add(n, Double.POSITIVE_INFINITY); } pq.printHeap(); while(!pq.isEmpty()) { workingNode = pq.deleteMin(); ns.add(workingNode); //pq.printHeap(); file.println("now WorkingNode is: " + workingNode.getName()); for(Arc a : workingNode.getArcs()) { file.println( "Processing Arc: " + a +" Distance are: " + workingNode.getName() + ": "+ workingNode.getDistance() + " + " + a.getWeight() + " = " + (workingNode.getDistance() + a.getWeight()) + " -> " + a.getTarget().getName() + ": " + a.getTarget().getDistance() ); if(workingNode.getDistance()+a.getWeight() < a.getTarget().getDistance()) { a.getTarget().setFather(workingNode); System.err.println("ho settato il padre di "+ a.getTarget().getName()+ " a " + workingNode.getName()); a.getTarget().setDistance(workingNode.getDistance()+a.getWeight()); file.println("Distance change: "+ a.getTarget().getName() + " now is " + a.getTarget().getDistance()); pq.changePriority(a.getTarget(), a.getTarget().getDistance()); } } } return ns; } }
I'm quite sure that somewhere I left a +1 or a -1 but I cannot find it (like usually happens in own code...)
I posted in offtopic because I think the problem is too dumb to be posted in "real" java sections :)
thank you in advance if someone wants to help me
Similar Threads
-
Priority Queue with explicit priority
By lsk in forum Advanced JavaReplies: 4Last Post: 06-10-2011, 07:16 PM -
Priority Queue
By Suende in forum New To JavaReplies: 19Last Post: 04-25-2011, 08:46 AM -
Priority Queue experts needed !!!
By niu_niu in forum New To JavaReplies: 48Last Post: 06-11-2010, 08:48 AM -
Priority Queue Question
By Taz_84 in forum New To JavaReplies: 0Last Post: 01-29-2009, 03:23 AM -
How to implement Priority queue with Java
By Java Tip in forum java.langReplies: 0Last Post: 04-12-2008, 08:49 PM


LinkBack URL
About LinkBacks
Reply With Quote

Bookmarks