Unity C# 优先队列

实现了支持泛型的优先队列,解决Unity官方不提供优先队列的问题。

API

属性和字段解释
size队列的长度
capacity队列的容量
IsEmpty返回队列是否为空
Top返回队列第一个元素
枚举解释
PriorityQueueMode.less最小优先队列
PriorityQueueMode.equal只会将相等的排在一起
PriorityQueueMode.greator最大优先队列
函数功能
Push入队一个元素
Pop出队一个元素
Peek返回第一个元素
Clear清空队列

示例

PriorityQueue<int> priorityQueue = new PriorityQueue<int>((a, b) => {if (a < b) return -1;else if (a == b) return 0;else if (a > b) return 1;return 0;
});priorityQueue.Push(8);
priorityQueue.Push(9);
priorityQueue.Push(3);
priorityQueue.Push(2);
priorityQueue.Push(7);
priorityQueue.Push(5);
priorityQueue.Push(0);while (!priorityQueue.IsEmpty) {Debug.Log(priorityQueue.Top);priorityQueue.Pop();
}

实现

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;namespace YBZ.Algorithm {public class PriorityQueue<T> where T : new (){public int size;public int capacity;private T[] elements;// 是否为空public bool IsEmpty { get => size == 0; }/// 返回顶部元素public T Top { get => elements[0]; }/// 优先队列的模式private PriorityQueueMode _comparator;public enum PriorityQueueMode {less = -1, // 最小优先队列equal = 0, // 相等的排在一起greater = 1 // 最大优先队列}/// <summary>/// 以CMP(a,b) 为例:/// 当a>b时,返回1,表示放右边/// 当a==b时,返回0,表示不变///  当a<b时,返回-1,表示放左边/// </summary>private Func<T,T,int> CMP;/// <summary>/// 构造函数, 必须实现/// </summary>/// <param name="CMP"></param>/// <param name="capacity"></param>/// <param name="priorityQueueMode"></param>public PriorityQueue(Func<T,T,int> CMP, PriorityQueueMode priorityQueueMode = PriorityQueueMode.less, int capacity = 1) {this.CMP = CMP;this.size = 0; // 数组索引从0开始this.capacity = capacity;this.elements = new T[capacity];this._comparator = priorityQueueMode;}/// <summary>/// 入队/// </summary>/// <param name="value"></param>public void Push(T value) {if (size == capacity) {ExpandCapacity();}elements[size++] = value;ShiftUp();}/// <summary>/// 出队/// </summary>public void Pop() {if(size == 0) {return;}size--;Swap(ref elements[0], ref elements[size]);ShiftDown();}/// <summary>/// 清空队列/// </summary>public void Clear() {size = 0;}/// <summary>/// 返回位于Queue开始处的对象但不将其移除。/// </summary>/// <returns>返回第一个队列中元素</returns>public T Peek() {return Top;}/// <summary>/// 扩展队列的容量/// </summary>private void ExpandCapacity() {capacity = Mathf.CeilToInt(capacity * 1.5f);T[] temp = new T[capacity];for (int i = 0; i < elements.Length; i++) {temp[i] = elements[i];}elements = temp;}// 从下到上 重排序 private void ShiftUp() {int cur = size - 1 ;int parent = ( cur -1 ) >> 2;while (cur > 0) {if (CMP(elements[cur],elements[parent]) == (int)_comparator) {Swap(ref elements[cur], ref elements[parent]);cur = parent;parent = (cur - 1) >> 2;} else break;}}// 从上到下 重排序private void ShiftDown() {int cur = 0;int child = 1;while (child < size) {if (child + 1 < size && CMP(elements[child +1], elements[child]) == (int)_comparator) {child++;}if (CMP(elements[child], elements[cur]) == (int)_comparator){Swap(ref elements[child], ref elements[cur]);cur = child;child = cur << 1 + 1;} else break;}}/// <summary>/// 交换传入的两个元素/// </summary>/// <param name="lhs"></param>/// <param name="rhs"></param>private void Swap(ref T lhs,ref T rhs) {T temp = lhs;lhs = rhs;rhs = temp;}/// <summary>/// 返回队列中的所有元素,对于ToString()函数,值类型会返回值,引用类型会返回数据类型/// </summary>/// <returns></returns>public override string ToString() {string result = "";foreach (var v in elements) {result += v.ToString();}return result;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泰国的区块链和NFT市场调研

泰国的区块链和NFT市场调研 基本介绍 参考&#xff1a; https://zh.wikipedia.org/zh-hans/%E6%B3%B0%E5%9B%BD参考&#xff1a; https://hktdc.infogram.com/thsc–1h7k2303zo75v2x zz制度&#xff1a; 君主立宪制&#xff08;议会制&#xff09; 国王&#xff1a; 玛哈哇集拉…

如何给Google Chrome增加proxy

1. 先打开https://github.com/KaranGauswami/socks-to-http-proxy/releases 我的电脑是Liunx系统所以下载第一个 2. 下载完之后把这个文件变成可执行文件&#xff0c;可以是用这个命令 chmod x 文件名 3. 然后执行这个命令&#xff1a; ./sthp-linux -p 8080 -s 127.0.0.1:…

HTTP协议

HTTP协议 应用层再谈 "协议"网络版计算器 HTTP协议认识URLurlencode和urldecodeHTTP协议格式HTTP的方法HTTP的状态码HTTP常见Header HTTPS协议HTTPS 是什么什么是"加密"为什么要加密常⻅的加密⽅式 HTTPS 的⼯作过程探究⽅案 1 - 只使⽤对称加密⽅案 2 - 只…

HBase-读流程

创建连接同写流程。 &#xff08;1&#xff09;读取本地缓存中的Meta表信息&#xff1b;&#xff08;第一次启动客户端为空&#xff09; &#xff08;2&#xff09;向ZK发起读取Meta表所在位置的请求&#xff1b; &#xff08;3&#xff09;ZK正常返回Meta表所在位置&#x…

企业权限管理(五)-订单分页

订单分页查询 PageHelper介绍 PageHelper是国内非常优秀的一款开源的mybatis分页插件&#xff0c;它支持基本主流与常用的数据库&#xff0c;例如mysql、oracle、mariaDB、DB2、SQLite、Hsqldb等。 PageHelper使用 集成 引入分页插件有下面2种方式&#xff0c;推荐使用 Maven …

TC3XX - MCAL知识点(二十三):ASCLIN MCAL配置及代码实战

目录 1、概述 2、EB-tresos配置 2.1、配置目标 2.2、LIN配置 2.2.1、LinGeneral 2.2.2、LinChannel

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统

文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户…

NLP实践——使用Llama-2进行中文对话

NLP实践——使用Llama-2进行中文对话 1. 前言2. 利用prompt3. 利用Logit Processor3.1 修改13.2 修改23.3 修改33.4 修改4 1. 前言 在之前的博客 NLP实践——Llama-2 多轮对话prompt构建中&#xff0c;介绍了如何构建多轮对话的prompt&#xff0c;本文将介绍如何使用Llama-2进…

Celery的基本使用

1.Celery介绍 1.1 Celery是什么&#xff1f; Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块专注于实时处理的异步任务队列同时也支持任务调度 Celery本身不含消息服务&#xff0c;它使用第三方消息服务来传递任务&#xff0c;目前&#xff0c;Ce…

无涯教程-Perl - 格式化

Perl使用称为“formats”的模板来输出内容。要使用Perl的格式函数&#xff0c;必须先定义一种格式&#xff0c;然后才能使用该格式写入格式化的数据。 定义格式 以下是定义Perl格式的语法- format FormatName fieldline value_one, value_two, value_three fieldline value…

图像的平移变换之c++实现(qt + 不调包)

1.基本原理 设dx为水平偏移量&#xff0c;dy为垂直偏移量&#xff0c;则平移变换的坐标映射关系为下公式&#xff0c;图像平移一般有两种方式。 1.不改变图像大小的平移&#xff08;一旦平移&#xff0c;相应内容被截掉&#xff09; 1&#xff09;当dx > width、dx < -wi…

(MVC)SpringBoot+Mybatis+Mapper.xml

前言&#xff1a;本篇博客主要对MVC架构、Mybatis工程加深下理解&#xff0c;前面写过一篇博客&#xff1a;SprintBoothtml/css/jsmybatis的demo&#xff0c;里面涉及到了Mybatis的应用&#xff0c;此篇博客主要介绍一种将sql语句写到了配置文件里的方法&#xff0c;即Mybatis里…

vue去掉所有输入框两边空格,封装指令去空格,支持Vue2和Vue3,ElementUI Input去空格

需求背景 就是页面很多表单输入框&#xff0c;期望在提交的时候&#xff0c;都要把用户两边的空格去掉 ❌使用 vue 的指令 .trim 去掉空格 中间会输入不了空格&#xff0c; 比如我想输入 你好啊 中国, 这中间的空格输入不了&#xff0c;只能变成 你好啊中国 ❌在提交的时候使用…

cesium学习记录04-坐标系

一、地理坐标系和投影坐标系的关系 地理坐标系 (Geographic Coordinate System, GCS) 定义&#xff1a;地理坐标系是一个基于三维地球表面的坐标系统。它使用经度和纬度来表示地点的位置。 特点&#xff1a; 使用经纬度来定义位置。 基于特定的地球参考椭球体。 适用于全球范…

设备固定资产管理系统

资产管理是企业经营和发展的基础&#xff0c;特别是设备资产管理。适当的设备资产管理可以有效地提升企业的经营效率&#xff0c;为提高核心竞争能力提供高效的前提。 固资及设备管理系统&#xff08;EAM&#xff09;它是一种有效的固定资产管理模式&#xff0c;可以帮助企业更…

不同组件之间相互传递信息的方式(拓展知识)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;补充知识&#xff1a;不同组件之间通过get&#xff08;&#xff09;方式传递信息 &#x1f380;父组件与子组件之间的信息交互 $emit 方法&#x1f3c5;父组件给子组件发…

gradle 命令行单元测试执行问题

文章目录 问题&#xff1a;命令行 执行失败最终解决方案&#xff08;1&#xff09;ADB命令&#xff08;2&#xff09;Java 环境配置 问题&#xff1a;命令行 执行失败 命令行 执行测试命令 无法使用&#xff08;之前还能用的。没有任何改动&#xff0c;又不能用了&#xff09; …

Unity游戏源码分享-仿开心消消乐Match3Jewel

Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88198762

uniapp 微信小程序 上下滚动的公告通知(只取前3条)

效果图&#xff1a; <template><view class"notice" click"policyInformation"><view class"notice-icon"><image mode"aspectFit" class"img" src"/static/img/megaphone.png"></i…

企业权限管理(三)-产品添加

产品添加 从product-list.jsp跳转到product-add.jsp <button type"button" class"btn btn-default" title"新建" onclick"location.href${pageContext.request.contextPath}/pages/product-add.jsp"><iclass"fa fa-file…