如何获取 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