如何为Dijkstra算法实现PriorityQueue?

时间:2017-11-04 22:34:55

标签: java algorithm sorting priority-queue dijkstra

我有一个关于为Dijkstra算法实现优先级队列的问题,因为这是一个hw所以我无法创建另一个类,所以我试图找到一种方法在优先级队列中添加节点(整数)但我想要队列,用于对节点内的权重进行排序,但不对节点本身进行排序。

例如,我有3个节点(0,1,2),节点0的权重为10,节点1的权重为15,节点2的权重为5。

Queue<Integer> queue = new PriorityQueue<Integer>();
queue.add(0);
queue.add(1);
queue.add(2);

while(!queue.isEmpty()){
    System.out.println(queue.poll());
}

这应该给我2.0,1的输出。 这可能不创建另一个类吗?或者除了优先级队列之外我还能使用不同的方法吗?

提前致谢!!!!!!任何帮助将不胜感激!

我能想到的一个解决方案是每次添加一个节点时对正常队列进行排序,所以如果我在队列中有节点2,0,1并且我想添加权重为8的节点3,我需要将权重与队列的顶部元素进行比较,直到它适合队列,因此在队列中它将是2,3,0,1,但这对于低效率来说是不合适的。

1 个答案:

答案 0 :(得分:1)

您有两种选择:

  1. 创建自己的Node类,并使其实现Comparable<Node>接口。该类将具有weight属性,并且可以根据其权重比较Node。这将创建Nodes PriorityQueue PriorityQueue(Comparator<? super E> comparator)将使用的Comparator

  2. 使用> docker container run --detach --name=test-mysql --env="MYSQL_ROOT_PASSWORD=mypassword" -p 3306:3306 mysql 构造函数创建优先级队列。它需要一个比较函数(import UIKit import Firebase import CoreLocation class SignupViewController: UIViewController,CLLocationManagerDelegate { let manager = CLLocationManager() let currentUserLocation = CLLocation! override func viewDidLoad() { super.viewDidLoad() let cloud = Storage.storage().reference(forURL: "gs://applesandoranges.appspot.com") ref = Database.database().reference() userStorage = cloud.child("users") manager.delegate = self manager.desiredAccuracy = kCLLocationAccuracyBest manager.requestWhenInUseAuthorization() manager.startUpdatingLocation() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let location = locations[0] let myLocation = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude) )来比较两个项目。因此,您可以使用节点的权重(不必保留在同一队列中)来比较该函数 - 可以动态计算或保存在某个单独的数据结构中。