Class PriorityQueue<TPriority, TElement>
- Namespace
- Ecng.Collections
- Assembly
- Ecng.Collections.dll
Represents a min priority queue.
public class PriorityQueue<TPriority, TElement> : ICollection<(TPriority, TElement)>, IEnumerable<(TPriority, TElement)>, IEnumerable, IQueue<(TPriority priority, TElement element)>
Type Parameters
TPrioritySpecifies the type of priority associated with enqueued elements.
TElementSpecifies the type of elements in the queue.
- Inheritance
-
PriorityQueue<TPriority, TElement>
- Implements
-
ICollection<(TPriority, TElement)>IEnumerable<(TPriority, TElement)>
- Inherited Members
- Extension Methods
Remarks
Implements an array-backed quaternary min-heap. Each element is enqueued with an associated priority that determines the dequeue order: elements with the lowest priority get dequeued first.
Constructors
PriorityQueue(Func<TPriority, TPriority, TPriority>)
Initializes a new instance of the PriorityQueue<TPriority, TElement> class.
public PriorityQueue(Func<TPriority, TPriority, TPriority> subtractAbs)
Parameters
subtractAbsFunc<TPriority, TPriority, TPriority>
PriorityQueue(Func<TPriority, TPriority, TPriority>, IComparer<TPriority>)
Represents a min priority queue.
public PriorityQueue(Func<TPriority, TPriority, TPriority> subtractAbs, IComparer<TPriority> comparer)
Parameters
subtractAbsFunc<TPriority, TPriority, TPriority>The function that calculates the absolute difference between two priorities.
comparerIComparer<TPriority>Custom comparer dictating the ordering of elements. Uses Default if the argument is null.
Remarks
Implements an array-backed quaternary min-heap. Each element is enqueued with an associated priority that determines the dequeue order: elements with the lowest priority get dequeued first.
Properties
Comparer
Gets the priority comparer used by the PriorityQueue<TPriority, TElement>.
public IComparer<TPriority> Comparer { get; }
Property Value
- IComparer<TPriority>
Count
Gets the number of elements contained in the PriorityQueue<TPriority, TElement>.
public int Count { get; }
Property Value
Methods
Clear()
Removes all items from the PriorityQueue<TPriority, TElement>.
public void Clear()
Dequeue()
Removes and returns the minimal element from the PriorityQueue<TPriority, TElement>.
public (TPriority priority, TElement element) Dequeue()
Returns
- (TPriority priority, TElement element)
The minimal element of the PriorityQueue<TPriority, TElement>.
Exceptions
- InvalidOperationException
The queue is empty.
DequeueEnqueue(TPriority, TElement)
Removes the minimal element and then immediately adds the specified element with associated priority to the PriorityQueue<TPriority, TElement>,
public TElement DequeueEnqueue(TPriority priority, TElement element)
Parameters
priorityTPriorityThe priority with which to associate the new element.
elementTElementThe element to add to the PriorityQueue<TPriority, TElement>.
Returns
- TElement
The minimal element removed before performing the enqueue operation.
Remarks
Implements an extract-then-insert heap operation that is generally more efficient than sequencing Dequeue and Enqueue operations: in the worst case scenario only one shift-down operation is required.
Exceptions
- InvalidOperationException
The queue is empty.
Enqueue(TPriority, TElement)
Adds the specified element with associated priority to the PriorityQueue<TPriority, TElement>.
public void Enqueue(TPriority priority, TElement element)
Parameters
priorityTPriorityThe priority with which to associate the new element.
elementTElementThe element to add to the PriorityQueue<TPriority, TElement>.
EnqueueDequeue(TPriority, TElement)
Adds the specified element with associated priority to the PriorityQueue<TPriority, TElement>, and immediately removes the minimal element, returning the result.
public TElement EnqueueDequeue(TPriority priority, TElement element)
Parameters
priorityTPriorityThe priority with which to associate the new element.
elementTElementThe element to add to the PriorityQueue<TPriority, TElement>.
Returns
- TElement
The minimal element removed after the enqueue operation.
Remarks
Implements an insert-then-extract heap operation that is generally more efficient than sequencing Enqueue and Dequeue operations: in the worst case scenario only one shift-down operation is required.
EnqueueRange(IEnumerable<(TPriority priority, TElement element)>)
Enqueues a sequence of element/priority pairs to the PriorityQueue<TPriority, TElement>.
public void EnqueueRange(IEnumerable<(TPriority priority, TElement element)> items)
Parameters
itemsIEnumerable<(TPriority, TElement)>The pairs of elements and priorities to add to the queue.
Exceptions
- ArgumentNullException
The specified
itemsargument was null.
EnqueueRange(TPriority, IEnumerable<TElement>)
Enqueues a sequence of elements pairs to the PriorityQueue<TPriority, TElement>, all associated with the specified priority.
public void EnqueueRange(TPriority priority, IEnumerable<TElement> elements)
Parameters
priorityTPriorityThe priority to associate with the new elements.
elementsIEnumerable<TElement>The elements to add to the queue.
Exceptions
- ArgumentNullException
The specified
elementsargument was null.
Peek()
Returns the minimal element from the PriorityQueue<TPriority, TElement> without removing it.
public (TPriority priority, TElement element) Peek()
Returns
- (TPriority priority, TElement element)
The minimal element of the PriorityQueue<TPriority, TElement>.
Exceptions
- InvalidOperationException
The PriorityQueue<TPriority, TElement> is empty.
TryDequeue(out TElement, out TPriority)
Removes the minimal element from the PriorityQueue<TPriority, TElement>,
and copies it to the element parameter,
and its associated priority to the priority parameter.
public bool TryDequeue(out TElement element, out TPriority priority)
Parameters
elementTElementThe removed element.
priorityTPriorityThe priority associated with the removed element.
Returns
- bool
true if the element is successfully removed; false if the PriorityQueue<TPriority, TElement> is empty.
TryPeek(out TElement, out TPriority)
Returns a value that indicates whether there is a minimal element in the PriorityQueue<TPriority, TElement>,
and if one is present, copies it to the element parameter,
and its associated priority to the priority parameter.
The element is not removed from the PriorityQueue<TPriority, TElement>.
public bool TryPeek(out TElement element, out TPriority priority)
Parameters
elementTElementThe minimal element in the queue.
priorityTPriorityThe priority associated with the minimal element.
Returns
- bool
true if there is a minimal element; false if the PriorityQueue<TPriority, TElement> is empty.