web-dev-qa-db-fra.com

La file d'attente prioritaire supprime le temps de complexité

Quelle est la complexité (big-oh) de la fonction remove() sur la classe Priority Queue en Java? Je ne trouve rien documenté nulle part, je pense que c'est O (n), étant donné que vous devez trouver l'élément avant de le supprimer, puis remanier l'arbre. mais j'en ai vu d'autres qui ne sont pas d'accord et pensent que c'est O (logn). Des idées?

29
samturner

La confusion est en fait causée par votre fonction "supprimer". En Java, il existe deux fonctions de suppression.

  1. remove () -> C'est pour supprimer la tête/racine, cela prend O(logN) temps.

  2. remove (Object o) -> Il s'agit de supprimer un objet arbitraire. La recherche de cet objet prend O(N) temps, et sa suppression prend O(logN) temps).

29
Chen

La complexité de remove est O(N) puisque la complexité de contains est O(N) (dans la classe de file d'attente prioritaire de Java)

Une façon de le faire O(logN) in la vôtre L'implémentation de la file d'attente prioritaire consiste à maintenir une structure de données auxiliaire comme un HashMap qui maintient les mappages à partir d'une valeur dans la file d'attente prioritaire à sa position dans la file d'attente. Donc, à tout moment - vous connaîtrez la position d'index de n'importe quelle valeur.

Notez que cette modification n'affecte le temps d'exécution d'aucune des opérations existantes - vous n'auriez besoin que de mettre à jour les mappages pendant les opérations de tas.

25
Hari

Selon la documentation Oracle: "Remarque sur l'implémentation: cette implémentation fournit O (log (n)) le temps pour les méthodes de compression et de compression (offre, interrogation, remove () and add); temps linéaire pour les méthodes remove (Object) et contient (Object); et temps constant pour les méthodes de récupération (peek, element et taille). "

Lien ici vers Oracle Doc

5
Bad Green