C# File D'Attente De Priorité
Je suis à la recherche d'une file d'attente de priorité avec une interface comme ceci:
class PriorityQueue<T>
{
public void Enqueue(T item, int priority)
{
}
public T Dequeue()
{
}
}
Toutes les implémentations j'ai vu supposer que item
est un IComparable
mais je n'aime pas cette approche; je veux spécifier la priorité quand je suis poussant dans la file d'attente.
Si un ready-made de mise en œuvre n'existe pas, quelle est la meilleure façon de faire moi-même? Ce sous-jacente de la structure de données dois-je utiliser? Une sorte de auto-équilibrage de l'arbre, ou quoi? Un standard C#.net la structure pourrait être sympa.
- Allez-vous l'appeler à partir de plusieurs threads?
- Non... mon programme est lié, mais un seul thread qui en ont besoin.
- La raison qui apparaît immédiatement à l'esprit pour T soutenant IComparable est que si vous poussez deux éléments dans la file d'attente avec priorité 2, vous avez encore besoin de comparer les éléments et de décider ce qui commande le processus de la deuxième priorité de deux éléments. . . Si, finalement, vous avez besoin de T à être comparables. Donc comment faire cela avec votre interface... eh Bien vous avez de bonnes suggestions ci-dessous.
- N'est-elle pas à l'encontre du but d'une file d'attente de priorité? C'est une file d'attente parce que le premier, est le premier. Il est ainsi décidé. Sinon, c'est une liste triée.
- D: Si toutes les clés sont le même, alors une file d'attente de priorité doit dégénérer à une file d'attente FIFO. Si l'ordre des éléments est utilisé, puis ce sera violé. Ainsi, la mise en œuvre d'une file d'attente de priorité qui dépend de l'ordre des éléments est suspect.
- connexes: stackoverflow.com/questions/2046674
- Également liées: cstheory.stackexchange.com/q/593/13809 (stable tas binaire)
Vous devez vous connecter pour publier un commentaire.
Si vous disposez déjà d'une file d'attente de priorité de mise en œuvre basé sur IComparable, vous pouvez facilement l'utiliser pour construire la structure dont vous avez besoin:
Vous pouvez ajouter des contrôles de sécurité et de ce pas, mais en voici une très simple de mise en œuvre à l'aide de
SortedList
:Je suis en supposant que les petites valeurs de
priority
correspondent à des éléments prioritaires (c'est facile à modifier).Si plusieurs threads accèdent à la file d'attente, vous aurez besoin d'ajouter un mécanisme de verrouillage de trop. C'est facile, mais laissez-moi savoir si vous avez besoin de conseils ici.
SortedList
est mis en œuvre, en interne comme un arbre binaire.Ci-dessus la mise en œuvre besoins suivants des classes d'assistance. Cette adresse Lasse V. Karlsen dans son commentaire que les articles avec le même niveau de priorité ne peut pas être ajoutée à l'aide de la naïveté de la mise en œuvre à l'aide d'un
SortedList
.Vous pourriez écrire un wrapper autour de l'une des implémentations existantes qui modifie l'interface de votre préférence:
C'est le même que itowlson de la suggestion. J'ai juste pris plus de temps à écrire le mien parce que j'ai rempli plusieurs des méthodes. :-s
PriorityQueueThatYouDontLike
. Même ceux qui utilise IComparables n'a pas l'air très agréable.Voici une très simple léger de mise en œuvre est O(log(n)) une performance à la fois push et pop. Il utilise un tas de structure de données construit sur une Liste<T>.
T
à êtreIComparable
.C'est l'exact interface utilisée par mon hautement optimisé C# en priorité de la file d'attente.
Il a été développé spécifiquement pour le pathfinding des applications (A*, etc.), mais il devrait fonctionner parfaitement pour toute autre application.
Le seul problème possible est que, dans le but d'extraire le maximum absolu de la performance, la mise en œuvre exige que les valeurs de file d'attente pour étendre
PriorityQueueNode
.Ce serait si terrible au sujet de quelque chose comme cela?
ElementAt()
. J'ai donc utiliséValues[0]
là.Je me rends compte que ta question en fait la demande, pour un non-IComparable basée sur la mise en œuvre, mais je tiens à signaler un article récent de
Visual Studio Magazine
.http://visualstudiomagazine.com/articles/2012/11/01/priority-queues-with-c.aspx
Cet article avec @itowlson peut donner une réponse complète.
Un peu en retard mais je vais ajouter ici pour référence
https://github.com/ERufian/Algs4-CSharp
Clé-valeur de la paire de files d'attente de priorité sont mis en œuvre dans Algs4/IndexMaxPQ.cs, Algs4/IndexMinPQ.cs et Algs4/IndexPQDictionary.cs
Notes:
Semble que vous pourriez rouler avec un seriews de Files d'attente, une pour chaque priorité. Dictionnaire et il suffit de l'ajouter à la.