117.info
人生若只如初见

C#中PriorityQueue怎么实现

在C#中,可以使用堆(Heap)来实现PriorityQueue。堆是一种特殊的二叉树结构,满足以下性质:

  1. 完全二叉树:除了最后一层,其他层的节点数都是满的,最后一层的节点都靠左排列。
  2. 堆序性:对于最大堆,父节点的值大于等于其子节点的值;对于最小堆,父节点的值小于等于其子节点的值。

在C#中,可以使用数组来表示堆。根据堆的性质,可以通过简单的数学运算来找到节点的父节点和子节点。

下面是一个使用数组实现最小堆的PriorityQueue的示例代码:

public class PriorityQueue where T : IComparable
{
    private List heap;

    public PriorityQueue()
    {
        heap = new List();
    }

    public int Count => heap.Count;

    public void Enqueue(T item)
    {
        heap.Add(item);
        HeapifyUp(heap.Count - 1);
    }

    public T Dequeue()
    {
        if (heap.Count == 0)
        {
            throw new InvalidOperationException("PriorityQueue is empty");
        }

        T firstItem = heap[0];
        int lastIndex = heap.Count - 1;
        heap[0] = heap[lastIndex];
        heap.RemoveAt(lastIndex);
        HeapifyDown(0);

        return firstItem;
    }

    private void HeapifyUp(int index)
    {
        int parentIndex = (index - 1) / 2;

        while (index > 0 && heap[index].CompareTo(heap[parentIndex]) < 0)
        {
            Swap(index, parentIndex);
            index = parentIndex;
            parentIndex = (index - 1) / 2;
        }
    }

    private void HeapifyDown(int index)
    {
        int leftChildIndex = 2 * index + 1;
        int rightChildIndex = 2 * index + 2;
        int smallestChildIndex = index;

        if (leftChildIndex < heap.Count && heap[leftChildIndex].CompareTo(heap[smallestChildIndex]) < 0)
        {
            smallestChildIndex = leftChildIndex;
        }

        if (rightChildIndex < heap.Count && heap[rightChildIndex].CompareTo(heap[smallestChildIndex]) < 0)
        {
            smallestChildIndex = rightChildIndex;
        }

        if (smallestChildIndex != index)
        {
            Swap(index, smallestChildIndex);
            HeapifyDown(smallestChildIndex);
        }
    }

    private void Swap(int index1, int index2)
    {
        T temp = heap[index1];
        heap[index1] = heap[index2];
        heap[index2] = temp;
    }
}

上述代码中,我们使用了一个List来存储堆的元素。Enqueue方法首先将元素添加到List的末尾,然后根据堆的性质进行上浮操作(HeapifyUp)。Dequeue方法首先将堆顶元素(即最小元素)取出,并将最后一个元素放到堆顶,然后根据堆的性质进行下沉操作(HeapifyDown)。

这样,我们就实现了一个使用数组实现最小堆的PriorityQueue。可以根据需要修改代码来实现最大堆或者自定义优先级的堆。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fea7dAzsLAwVeB10.html

推荐文章

  • c#winform开发中DialogResult的用法

    在C# WinForms开发中,DialogResult是一个用于指示对话框的返回结果的枚举类型。它定义了一组常用的对话框结果,如确定、取消、是、否等。
    DialogResult枚举...

  • C++中的splice()函数怎么调用

    在C++中,splice()函数是std::list容器的成员函数,用于将一个列表插入到另一个列表的指定位置。splice()函数有两种形式的调用方式:1. 将一个列表的所有元素插入...

  • C++中include iostream是什么

    在C++中,#include 是一个预处理指令,用于引入标准输入输出库(iostream库)的头文件。它允许程序使用输入输出流(如cin和cout)来进行输入输出操作。通过包含该...

  • c++修改文件(夹)的用户访问权限程序代码

    以下是一个示例代码,用于修改文件或文件夹的用户访问权限:
    #include #include int main() { std::string path = "/path/to/file_or_folder"; int permiss...

  • hbase怎么查看列族下的列

    在HBase中,可以使用HBase Shell或HBase Java API来查看列族下的列。 使用HBase Shell:
    首先,打开HBase Shell并连接到HBase集群。然后,使用以下命令列出...

  • mysql group_concat用法

    GROUP_CONCAT 函数用于将一列的多个值连接为一个字符串,并可以选择使用分隔符来分隔这些值。
    语法:
    GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORD...

  • 在python中%的用法

    在Python中,"%"是一个格式化操作符,用于将值插入到字符串中的占位符中。
    例如,可以使用百分号来格式化字符串:
    name = "John"
    age = 25
    ...

  • python中set函数的用法

    在Python中,set()函数是用来创建一个集合对象的。集合是一个无序且不重复的集合,可以用来进行集合的运算,比如并集、交集、差集等。
    set()函数的用法有以...