Mar*_*ons 0 c# priority-queue .net-6.0
我正在初始化一个存储 XY 坐标的优先级队列,根据距原点的欧几里得距离确定优先级。我创建了一个自定义Comparer,使其作为最大堆运行:
PriorityQueue<int[], double> maxHeap = new PriorityQueue<int[], double>(Comparer<double>.Create((x, y) => x.CompareTo(y)));
这非常有效,除了有时我希望能够使用Peek(). 我可以获取元素的值,即具有 type 的点int[],但无法获取优先级。我没有看到任何可以让我访问的东西TPriority。以此用例为例,这是堆的常见用法,用于获取集合中的顶部/底部 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);
    }
}
Run Code Online (Sandbox Code Playgroud)
您将看到我必须再次计算堆顶部元素的欧几里德距离。Visual Studio 向我展示了这一点,尽管我似乎无法访问引用优先级的 double 类型的第二个属性。
您可以根据需要使用这两种方法中的任何一种
TryPeek - 如果您想获取值和优先级值而不从队列中弹出。
此方法返回 false - 如果队列为空,否则返回 true
myHeap.TryPeek(out TElement element, out TPriority priority)
myHeap.TryPeek(out int val, out int priorityval); //for int type
Run Code Online (Sandbox Code Playgroud)
TryDequeue - 如果您想将值与优先级值一起弹出。
此方法返回 false - 如果队列为空,否则返回 true
myHeap.TryDequeue(out TElement element, out TPriority priority)
myHeap.TryDequeue(out int val, out int priorityval); // for int type
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5105 次  |  
        
|   最近记录:  |