web-dev-qa-db-fra.com

Complexité temporelle d'une file d'attente prioritaire en C ++

La création d'un segment prend O(n) temps, tandis que l'insertion dans un segment (ou file d'attente prioritaire) prend du temps log (n). Prendre n entrées et les insérer dans la file d'attente prioritaire, ce qui serait la complexité temporelle de l'opération. O(n) ou O (n * log (n)).

En outre, le même résultat serait valable en cas de vidage de la totalité du tas (c'est-à-dire n suppressions), non?

6
Kshitij Kohli

Si vous avez un tableau de taille n et que vous souhaitez créer un tas à partir de tous les éléments à la fois, l'algorithme de Floyd peut le faire avec une complexité O(n). Voir - Construire un tas . Cela correspond aux constructeurs std :: priority_queue qui acceptent un paramètre de conteneur.

Si vous avez une file d'attente prioritaire vide à laquelle vous souhaitez ajouter n éléments, un par un, alors la complexité est O (n * log (n)).

Donc, si vous avez tous les éléments qui iront dans votre file d'attente avant de le créer, la première méthode sera plus efficace. Vous utilisez la deuxième méthode - ajouter des éléments individuellement - lorsque vous devez gérer une file d'attente: ajouter et supprimer des éléments sur une certaine période.

La suppression des éléments n de la file d'attente prioritaire est également O (n * log (n)).

La documentation pour std :: priority_queue inclut la complexité d'exécution de toutes les opérations.

10
Jim Mischel