आप सुरक्षा जाँच और क्या नहीं जोड़ सकते हैं, लेकिन यहाँ एक बहुत ही सरल SortedList
का उपयोग कर दिया गया है:
class PriorityQueue<T> {
SortedList<Pair<int>, T> _list;
int count;
public PriorityQueue() {
_list = new SortedList<Pair<int>, T>(new PairComparer<int>());
}
public void Enqueue(T item, int priority) {
_list.Add(new Pair<int>(priority, count), item);
count++;
}
public T Dequeue() {
T item = _list[_list.Keys[0]];
_list.RemoveAt(0);
return item;
}
}
मैं यह सोचते हैं रहा है कि priority
के छोटे मूल्यों (उच्च प्राथमिकता आइटम के अनुरूप इस संशोधित करने के लिए आसान है)।
यदि एकाधिक धागे कतार तक पहुंच जाएंगे तो आपको लॉकिंग तंत्र भी जोड़ना होगा। यह आसान है, लेकिन अगर आपको मार्गदर्शन की आवश्यकता है तो मुझे बताएं।
SortedList
आंतरिक रूप से एक बाइनरी पेड़ के रूप में लागू किया गया है।
उपर्युक्त कार्यान्वयन निम्नलिखित सहायक वर्गों की आवश्यकता है। यह पता लास वी। कार्ल्सन की टिप्पणी है कि एक ही प्राथमिकता वाले आइटम को SortedList
का उपयोग करके निष्पक्ष कार्यान्वयन का उपयोग करके जोड़ा नहीं जा सकता है।
class Pair<T> {
public T First { get; private set; }
public T Second { get; private set; }
public Pair(T first, T second) {
First = first;
Second = second;
}
public override int GetHashCode() {
return First.GetHashCode()^Second.GetHashCode();
}
public override bool Equals(object other) {
Pair<T> pair = other as Pair<T>;
if (pair == null) {
return false;
}
return (this.First.Equals(pair.First) && this.Second.Equals(pair.Second));
}
}
class PairComparer<T> : IComparer<Pair<T>> where T : IComparable {
public int Compare(Pair<T> x, Pair<T> y) {
if (x.First.CompareTo(y.First) < 0) {
return -1;
}
else if (x.First.CompareTo(y.First) > 0) {
return 1;
}
else {
return x.Second.CompareTo(y.Second);
}
}
}
क्या आप इसे एकाधिक धागे से कॉल करने जा रहे हैं? – sohum
@sohum: नहीं ... मेरा प्रोग्राम * थ्रेड किया गया है, लेकिन केवल एक थ्रेड को इसकी पहुंच की आवश्यकता होगी। – mpen
आईसीओपरपेबल का समर्थन करने के लिए तुरंत ध्यान देने योग्य कारण यह है कि यदि आप प्राथमिकता 2 के साथ कतार में दो आइटम धक्का देते हैं, तो आपको अभी भी आइटम की तुलना करने और दो प्राथमिकताओं को दो प्राथमिकताओं को संसाधित करने का आदेश तय करने की आवश्यकता है। । । तो आखिरकार आपको तुलनीय होने की आवश्यकता है। तो अपने इंटरफेस के साथ ऐसा कैसे करें ... ठीक है आपको नीचे कुछ अच्छे सुझाव मिल गए हैं। –