二叉堆(BinaryHeap)的一种C#实现

二叉堆(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; }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值