如何获取 C# PriorityQueue 元素的优先级
How to get Priority of C# PriorityQueue element
我正在初始化一个存储 XY 坐标的优先级队列,按它们与原点的欧几里德距离排列优先级。我创建了一个自定义 Comparer
使其作为最大堆运行:
PriorityQueue<int[], double> maxHeap = new PriorityQueue<int[], double>(Comparer<double>.Create((x, y) => x.CompareTo(y)));
这很好用,除了有时我希望能够使用 Peek()
查看堆的顶部。我可以获得元素的值,类型为 int[]
的点,但我无法获得优先级。我没有看到任何允许我访问 TPriority
的内容。以这个用例为例,这是堆的常见用法,用于获取集合中的 top/bottom K 个元素:
for (int i = k; i < points.Length; i++)
{
double euclidianDistance = EuclidianDistance(points[i]);
if (euclidianDistance < EuclidianDistance(maxHeap.Peek()))
{
maxHeap.Dequeue();
maxHeap.Enqueue(points[i], euclidianDistance);
}
}
您将看到我必须再次计算堆顶部元素的欧几里德距离。 Visual Studio 向我展示了这一点,尽管我似乎无法访问表示优先级的 double 类型的第二个 属性。
我发现这需要使用 try/get:
for (int i = k; i < points.Length; i++)
{
double euclidianDistance = EuclidianDistance(points[i]);
if (maxHeap.TryPeek(out int[] topPoint, out double priority) && euclidianDistance < priority)
{
maxHeap.Dequeue();
maxHeap.Enqueue(points[i], euclidianDistance);
}
}
您可以根据需要使用这两种方法中的任何一种
TryPeek - 如果你想在不弹出队列的情况下获取值和优先级值。
此方法returns false - 如果队列为空,否则为 true
myHeap.TryPeek(out TElement element, out TPriority priority)
myHeap.TryPeek(out int val, out int priorityval); //for int type
TryDequeue - 如果要将值与优先级值一起弹出。
此方法returns false - 如果队列为空,否则为 true
myHeap.TryDequeue(out TElement element, out TPriority priority)
myHeap.TryDequeue(out int val, out int priorityval); // for int type
我正在初始化一个存储 XY 坐标的优先级队列,按它们与原点的欧几里德距离排列优先级。我创建了一个自定义 Comparer
使其作为最大堆运行:
PriorityQueue<int[], double> maxHeap = new PriorityQueue<int[], double>(Comparer<double>.Create((x, y) => x.CompareTo(y)));
这很好用,除了有时我希望能够使用 Peek()
查看堆的顶部。我可以获得元素的值,类型为 int[]
的点,但我无法获得优先级。我没有看到任何允许我访问 TPriority
的内容。以这个用例为例,这是堆的常见用法,用于获取集合中的 top/bottom K 个元素:
for (int i = k; i < points.Length; i++)
{
double euclidianDistance = EuclidianDistance(points[i]);
if (euclidianDistance < EuclidianDistance(maxHeap.Peek()))
{
maxHeap.Dequeue();
maxHeap.Enqueue(points[i], euclidianDistance);
}
}
您将看到我必须再次计算堆顶部元素的欧几里德距离。 Visual Studio 向我展示了这一点,尽管我似乎无法访问表示优先级的 double 类型的第二个 属性。
我发现这需要使用 try/get:
for (int i = k; i < points.Length; i++)
{
double euclidianDistance = EuclidianDistance(points[i]);
if (maxHeap.TryPeek(out int[] topPoint, out double priority) && euclidianDistance < priority)
{
maxHeap.Dequeue();
maxHeap.Enqueue(points[i], euclidianDistance);
}
}
您可以根据需要使用这两种方法中的任何一种
TryPeek - 如果你想在不弹出队列的情况下获取值和优先级值。
此方法returns false - 如果队列为空,否则为 true
myHeap.TryPeek(out TElement element, out TPriority priority)
myHeap.TryPeek(out int val, out int priorityval); //for int type
TryDequeue - 如果要将值与优先级值一起弹出。
此方法returns false - 如果队列为空,否则为 true
myHeap.TryDequeue(out TElement element, out TPriority priority)
myHeap.TryDequeue(out int val, out int priorityval); // for int type