二叉堆(BinaryHeap)的一种C#实现
最近项目里用到了寻路,可以用两种算法实现,迪杰斯特拉和AStar。其中AStar是迪杰斯特拉算法的一种改进,所以使用更广泛一点。这篇文章不讨论这两种算法,而聚焦于这两种算法中都用到的一种数据结构——二叉堆(BinaryHeap)。
在这两种算法中的性能瓶颈最可能发生在从”开表”中取出路径最短的节点,也就是从一个集合中取出最小元素。最简单的方法当然就是对集合进行排序,然后取出最小值,而排序操作往往需要耗费大量的性能,尤其是元素较多时。其实我们只需要得到最小的元素,而不太关心其他元素。二叉堆就是这样一种数据结构。具体的概念和原理在这里:
总结来说,这种数据结构使用一个数组实现,它总是可以保证第0个元素是集合中最小(最小堆)或者最大(最大堆)的,而不保证之后的元素顺序。在寻路中需要的是最小堆。在二叉堆中插入,删除操作复杂度都为O(log2n),要优于大部分的排序算法。下面给出一种二叉堆在C#中的实现:
using System;
/* 二叉堆用于寻路
* 注意T为值类型时默认值对结果的影响
* 最小堆
*/
public class BinaryHeap<T> where T : IComparable<T>
{
private readonly T[] items;
private readonly bool IsClass;
public int Count { get; private set; }