A star前置算法优先队列

A* 寻路算法 其中最重要的就是如何确保我们每次走的都是权值最小的路径这样就可以保证我们寻找的路径是最优的。

优先队列

优先队列是实现A*寻路算法的时候根据权重找出对应的结点很好的方法。

什么是优先队列

优先队列是0个元素和多个元素的集合,每一个元素都有一个优先权限,我们可以对这个队列进行的操作有 插入,删除,当我们
首先优先队列 一般是由满二叉堆来实现的 而二叉堆逻辑上是一个满二叉树。

什么是满二叉树

假设一个二叉树由k层 ,在k-1层之前 每一层的结点的都是2^(k-1-1) 而且第二层的结点都是从最左边网友排列的
根据子节点和父节点的关系 又可以分为最大堆,最小堆
最大堆:每一个结点的值总是大于或者等于子节点的值,因此最大堆的跟节点就是堆的最大值
最小堆:每一个结点的值总是小于或者等于子节点的值,因此最小堆的跟节点就是堆的最小值

假节点为i
父节点 (i-1)/ 2
左子结点 2i+1
右子结点 2i+2

因此代码中,逻辑结构上基于完全二叉树实现,数据存储基于数组实现

namespace UIRANK;
class Program
{
    static void Main(string[] args)
    {
        PriorityQueue<int> priorityQueue = new PriorityQueue<int>();

        
        priorityQueue.EnQuene(1);
        priorityQueue.EnQuene(2);
        priorityQueue.EnQuene(3);
        priorityQueue.EnQuene(4);
        priorityQueue.EnQuene(5);
        priorityQueue.EnQuene(6);
        priorityQueue.EnQuene(5);
        priorityQueue.EnQuene(5);
        priorityQueue.EnQuene(5);
        priorityQueue.EnQuene(5);
        priorityQueue.EnQuene(9);
        Console.WriteLine(priorityQueue.Size);
        Console.WriteLine(priorityQueue.Capacity);
        Console.WriteLine(priorityQueue.Peek());
        Console.WriteLine(priorityQueue.DeQuene());
        Console.WriteLine(priorityQueue.Size);
        Console.WriteLine(priorityQueue.Peek());

        Console.ReadKey();
    }



}
/// 使用的是范型类,并且规定了T只能是可以比较的类型
class PriorityQueue<T> where T : IComparable<T> {
    // 数组的范围
    private int _capacity;
    public int Capacity {

        get {
            if (_capacity < 0) {
                _capacity = 0;

            }
            return _capacity;
        }

        set {
            _capacity = value;
        }
    }
	// 当前数组内存了多少个元素
    private int _size;

    public int Size {
        get {
            if (_size < 0) {
                _size = 0;
            }
            return _size;
        }

        set => _size = value;
    }


    private T[] elements;
    IComparer<T> _comparer;
	// 介绍一下这个构造函数,首先是已经给参数一个默认为10的范围,因为这里要使用到比较函数可能有的时候需要我们根据需求自定义比较所以就用到IComparer这个接口用来让我们使用自定义的比较函数
	// 这个this 表示的调用了第二个构造函数 ,只是传了一个默认的比较器(不想自定义的时候使用)
    public PriorityQueue(int capacity = 10) : this(Comparer<T>.Default, capacity) { }

    public PriorityQueue(IComparer<T> comparer, int capacity = 10) {
        _comparer = comparer ?? Comparer<T>.Default;
        Size = 0;
        Capacity = capacity;
        elements = new T[capacity];
    }

	// 是否为空
    public bool isEmpty => Size == 0;

    private T Top => elements[0];
	// 获得队列最前面的元素(最大值)
    public T Peek() {
        if (isEmpty) {
            throw new Exception("当前队列中没有元素");
        }
        return Top;
    }
    /// 添加元素
    public void EnQuene(T data) {
        if (Size == Capacity) {
            ExtendCapacity();
        }
        elements[Size] = data;
        HeapInsert(Size);
        Size++;
    }
    /// 删除队列最前面的元素 
    public T? DeQuene() {
        if (Size == 0) {
            return default(T);
        }

        T element = elements[0];
        // 删除栈顶的元素然后交换到栈尾
        Swap(elements,0,Size-1);
        Size--;
        //将剩下的元素继续保持原来的优先队列 
        Heapify(0,Size);
        return element;
    }

    /// <summary>
    /// 删除掉队列最上面的值之后需要重新找到最大的值补上并且保证我们的数据结构还是优先队列。
    /// </summary>
    /// <param name="index"></param>
    /// <param name="size"></param>
    private void Heapify(int index,int size) {
        int left = index * 2 + 1;
        while (left < size) {
            int Customsize = left + 1 < size && _comparer.Compare(elements[left + 1], elements[left]) > 0 ? left + 1 : left;
            if (_comparer.Compare(elements[Customsize], elements[index]) ==0) {
                break;
            }
            Swap(elements, Customsize, index);
            index = Customsize;
            left = index * 2 + 1;
        }
    }


    /// <summary>
    /// 当我们 增加元素之后将该元素与父节点对应的元素进行比较如果比父节点对应的元素大 则进行替换
    /// </summary>
    /// <param name="index"></param>
    private void HeapInsert(int index) {
        while (index > 0 && _comparer.Compare(elements[index], elements[(index-1)/2]) > 0) {
            Swap(elements, index, (index - 1) / 2);
            index = (index - 1) / 2;
        }
    }

	/// 动态扩容
    private void ExtendCapacity() {
        Capacity = Capacity * 2;
        T[] newElements = new T[Capacity];
        for (int i = 0; i < elements.Length; i++) {
            newElements[i] = elements[i];
        }
        elements = newElements;
    }
	/// 转换两个元素的位置
    private void Swap(T[] tempElements ,int i,int j) {
        var temp = tempElements[i];
        tempElements[i] = tempElements[j];
        tempElements[j] = temp;
    }
}

这里坐一下提醒:这里使用的是 vs2023 使用的是.net7 其中namespace 没有大括号了,并且没有使用using System; 和 using System.Collections.Generic;
其实.net7 已经有内置的优先队列了,但是unity最新版也只支持 c# 9 对应.net 5 而优先队列是从 .net6 开始支持的。大家感兴趣的可以去官网查看具体信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/586592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

社交媒体数据恢复:推特、Twitter

推特&#xff08;Twitter&#xff09;数据恢复&#xff1a;如何找回丢失的内容 随着社交媒体的普及&#xff0c;越来越多的人开始使用推特&#xff08;Twitter&#xff09;来分享生活点滴、发表观点和获取信息。然而&#xff0c;有时候我们会不小心删除了重要的推文&#xff0…

【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化

🟣【Jenkins】持续集成与交付 (四):修改Jenkins插件下载地址、汉化 一、修改Jenkins插件下载地址二、汉化Jenkins三、关于Jenkins💖The Begin💖点点关注,收藏不迷路💖 一、修改Jenkins插件下载地址 由于Jenkins官方插件地址下载速度较慢,我们可以通过修改下载地址…

上位机图像处理和嵌入式模块部署(树莓派4b利用驱动实现进程数据共享)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论过&#xff0c;目前在linux系统上面有很多办法可以实现多进程数据共享。这里面比如说管道&#xff0c;比如说共享内存&#xff0c;比如…

uniapp 自定义 App启动图

由于uniapp默认的启动界面太过普通 所以需要自定义个启动图 普通的图片不可以过不了苹果的审核 所以使用storyboard启动图 生成 storyboard 的网站&#xff1a;初雪云-提供一站式App上传发布解决方案

Docker-compose部署LTC同步节点

1、下载ltc程序包&#xff0c;litecoin下载地址 下载页 mkdir /data/docker-compose/ltc cd /data/docker-compose/ltc https://github.com/litecoin-project/litecoin/releases/download/v0.21.3/litecoin-0.21.3-x86_64-linux-gnu.tar.gz2、编写dockerfile和bitcoin.conf b…

笔记-word导出PDF老是更新域导致图片和表格题注发生变化

问题描述&#xff1a;微软word 导出PDF时&#xff0c;老是更新域&#xff0c;导致图片和表格题注否跟着变化 以下是解决方法的具体描述。 目录 一、准备工作二、操作步骤 一、准备工作 1、工具版本&#xff1a;微软 word 2016&#xff08;其他微软word版本也OK&#xff09; …

第二证券投资参考:汽车以旧换新细则发布 云厂商AI投资持续加码

上星期五&#xff0c;A股放量大涨。两市股指盘中单边上行&#xff0c;午后再度攀升&#xff0c;沪指涨超1%&#xff0c;创业板指大涨超3%&#xff1b;到收盘&#xff0c;沪指涨1.17%报3088.64点&#xff0c;深证成指涨2.15%报9463.91点&#xff1b;创业板指涨3.34%报1823.74点&…

2024五一数学建模B题思路代码与论文分析

2024五一数学建模B题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# B题 未来新城交通需求规划与可达率问题需要建立的模型和算法: 1. 图论 2. 网络流模型 3. 线性规划/整数规划 4. 组合优化 5. 随机过程 6. …

es环境安装及php对接使用

Elasticsearch Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java语言开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是一种流行的…

76、堆-数据流的中位数

思路&#xff1a; 这个问题是动态数据流中位数查找问题。在数据流中&#xff0c;数据是逐个到来的&#xff0c;而我们需要在任何时候快速返回已有数据的中位数。中位数是将数据集分成两个等长的子集&#xff0c;一个包含所有较小的元素而另一个包含所有较大的元素。 为了高效解…

利用word2vec包将中文转变为词向量

代码展示&#xff1a; import jieba import re import json import logging import sys import gensim.models as word2vec from gensim.models.word2vec import LineSentence, loggerpattern u[\\s\\d,.<>/?:;\\"[\\]{}()\\|~!\t"#$%^&*\\-_a-zA-Z&…

【算法刷题 | 贪心算法05】4.27(K次取反后最大化的数组和、加油站)

文章目录 8.K次取反后最大化的数组和8.1题目8.2解法&#xff1a;贪心8.2.1贪心思路8.2.2代码实现 9.加油站9.1题目9.2解法&#xff1a;贪心9.2.1贪心思路9.2.2代码实现 8.K次取反后最大化的数组和 8.1题目 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数…

【基础算法总结】滑动窗口一

滑动窗口 1.长度最小的字数组2.无重复字符的最长子串3.最大连续1的个数 III4.将 x 减到 0 的最小操作数 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&…

利用大型语言模型提升个性化推荐的异构知识融合方法

在推荐系统中&#xff0c;分析和挖掘用户行为是至关重要的&#xff0c;尤其是在美团外卖这样的平台上&#xff0c;用户行为表现出多样性&#xff0c;包括不同的行为主体&#xff08;如商家和产品&#xff09;、内容&#xff08;如曝光、点击和订单&#xff09;和场景&#xff0…

《QT实用小工具·四十九》QT开发的轮播图

1、概述 源码放在文章末尾 该项目实现了界面轮播图的效果&#xff0c;包含如下特点&#xff1a; 左右轮播 鼠标悬浮切换&#xff0c;无需点击 自动定时轮播 自动裁剪和缩放不同尺寸图片 任意添加、插入、删除 单击事件&#xff0c;支持索引和自定义文本 界面美观&#xff0c;圆…

服务器部署开源大模型完整教程 Ollama+Llama3+open-webui

前言 最近大语言模型大火&#xff0c;正好最近打比赛可能会用得上LLMs&#xff0c;今天就在学校的服务器上面进行一次部署。这样之后就可以直接在内网里面使用学校的LLMs了。 介绍 Ollama&#xff1a;一款可以让你在本地快速搭建大模型的工具 官网&#xff1a;https://olla…

基于uniapp vue3.0 uView 做一个点单页面(包括加入购物车动画和左右联动)

1、实现效果&#xff1a; 下拉有自定义组件&#xff08;商品卡片、进步器、侧边栏等&#xff09;源码 2、左右联动功能 使用scroll-view来做右边的菜单页&#xff0c;title的id动态绑定充当锚点 <scroll-view :scroll-into-view"toView" scroll-with-animation…

【C++】封装哈希表 unordered_map和unordered_set容器

目录​​​​​​​ 一、unordered系列关联式容器 1、unordered_map 2、unordered_map的接口 3、unordered_set 二、哈希表的改造 三、哈希表的迭代器 1、const 迭代器 2、 operator 3、begin()/end() ​ 4、实现map[]运算符重载 四、封装 unordered_map 和 unordered_se…

基于t972 Android9 AP6256,如何在设置中添加5G热点选项,并使其正常打开

通过设置的的WiFi热点选项可以知道关键词“2.4GHz”&#xff0c;因此可以其全局搜索&#xff0c;在packages\apps\Settings\res\values\strings.xml文件下找到如下图所示&#xff0c; 从上面注释可以知道&#xff0c;选项按键选择2.4GHz触发的按键关键词是“wifi_ap_choose_2G…

JAVA读取从WPS在Excel中嵌入的图片资源

读取从WPS在Excel中嵌入的图片资源 引言 许多数据文件中可能包含嵌入式图片&#xff0c;这些图片对于数据分析和可视化非常重要。然而&#xff0c;从 WPS 在 Excel 中读取这些图片可能会有一些技术挑战。在本文中&#xff0c;我将展示如何从 WPS Excel 文件中读取嵌入的图片&am…
最新文章