Changer la priorité d'éléments dans une file d'attente de priorité

À l'aide de la Scala de 2,9 à mettre en œuvre une sorte de Dijkstra algorithme (en pseudo-code)

val queue = new PriorityQueue
queue.insert(...)
while (!queue.isEmpty) {
  val u = queue.extractMin
  queue.foreach { v =>
    if (condition(u, v))
      queue.decreaseKey(v, newPriority)
  }
}

J'aimerais changer la priorité d'un élément dans Scala collection.mutable.PriorityQueue.

Donc essayé de

  • supprimer l'élément
  • changer la priorité
  • réinsérez-la dans la file d'attente.

Mais je ne peux pas trouver une méthode pour priorité de mise à jour ou de supprimer un élément spécifique (pas
nécessairement l'élément de tête) comme java.util.PriorityQueue#remove(Object) rien gagné dans
Suppression d'un élément dans une file d'attente de priorité.

  • Comment cette tâche peut être fait avec scala.collection.mutable.PriorityQueue
    ou dois-je utiliser java.util.PriorityQueue à la place?
  • Personne ne sait si l'absence d'une telle méthode est, par conception, et il serait recommandé
    pour reconstruire la file d'attente après la modification de la priorité de certains articles (peut-être jeter un oeil à la discussion sur File d'attente de priorité avec élément dynamique priorités)?
Je ne suis pas un Scala utilisateur, mais je sais que java.util.PriorityQueue manque de soutien pour diminuer-clé. Je crois que c'est parce que, pour soutenir efficacement diminuer-clé, vous devez être en mesure d'accéder de manière aléatoire les éléments de la PriorityQueue, quelque chose que Java version ne prend pas en charge.
BTW, Êtes-vous sûr que PriorityQueue est la bonne solution pour votre problème, puisque je vois que vous ne l'utilisez pas des avantages directs et autant que je sache, l'accès aléatoire opérations sur les Files d'attente sera O(n)?
Vous connaissez un remplacement pour PriorityQueue dans Dijkstra comme des algorithmes (insert, extractMin et decreaseKey sont utilisés)? Et j'ai lu que l'accès aléatoire pourrait être O(1) pour le stockage de position d'insertion d'éléments - mais je crains que ce n'est pas réalisée par la norme impl.
PriorityQueue sera parfaitement apte à extractMin-diminution-enqueueBack, j'ai été dérangée par des ce n'est pas nécessairement l'élément de tête
Après chaque extractMin étape il y a peut-être quelques decreaseKey (cela signifie que certains (et donc pas en tête) des éléments prioritaires de changement de la valeur (diminue)).

OriginalL'auteur binuWADa | 2012-02-01