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
TPriority
Specifies the type of priority associated with enqueued elements.
TElement
Specifies 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
subtractAbs
Func<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
subtractAbs
Func<TPriority, TPriority, TPriority>The function that calculates the absolute difference between two priorities.
comparer
IComparer<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
priority
TPriorityThe priority with which to associate the new element.
element
TElementThe 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
priority
TPriorityThe priority with which to associate the new element.
element
TElementThe 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
priority
TPriorityThe priority with which to associate the new element.
element
TElementThe 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
items
IEnumerable<(TPriority, TElement)>The pairs of elements and priorities to add to the queue.
Exceptions
- ArgumentNullException
The specified
items
argument 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
priority
TPriorityThe priority to associate with the new elements.
elements
IEnumerable<TElement>The elements to add to the queue.
Exceptions
- ArgumentNullException
The specified
elements
argument 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
element
TElementThe removed element.
priority
TPriorityThe 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
element
TElementThe minimal element in the queue.
priority
TPriorityThe priority associated with the minimal element.
Returns
- bool
true if there is a minimal element; false if the PriorityQueue<TPriority, TElement> is empty.