【golang】使用container/heap官方包实现一个优先队列

news/2024/9/15 18:18:05/ 标签: golang, 开发语言, 后端

golang实现优先队列,以前写的一个简单例子,现上传备份


package testimport ("container/heap""fmt"
)func Test() {// 测试一下任务队列// 1、首先测试是标准任务队列,队列之中的元素是结构体Personpq := &AgePQ{}heap.Init(pq)ages := []int{2, 3, 1, 6, 5}for i := range ages {tem := &Person{Age: ages[i]}heap.Push(pq, tem)}// 查看pq情况fmt.Println(heap.Pop(pq).(*Person).Age) //6fmt.Println(heap.Pop(pq).(*Person).Age) //5fmt.Println(heap.Pop(pq).(*Person).Age) //3fmt.Println(heap.Pop(pq).(*Person).Age) //2fmt.Println(heap.Pop(pq).(*Person).Age) //1// 这里要注意一下pop方法是在队列的顶进行的操作,如果是升序,则pop出的是最小的值,降序则pop出的是最大的值fmt.Println("—————我是传说中的分割线————")// 2、接下来测试的是int元素所组成的优先队列pq1 := &PQ_of_int{}heap.Init(pq1)for i := range ages {heap.Push(pq1, ages[i])}fmt.Println(heap.Pop(pq1).(int)) //1fmt.Println(heap.Pop(pq1).(int)) //2fmt.Println(heap.Pop(pq1).(int)) //3fmt.Println(heap.Pop(pq1).(int)) //5fmt.Println(heap.Pop(pq1).(int)) //6// 测试结果显示,这两个类型的优先队列都是能完成的
}// 结构体优先队列
type Person struct {Age int
}
type AgePQ []*Personfunc (pq AgePQ) Len() int {return len(pq)
}
func (pq AgePQ) Less(i, j int) bool {// 我们这按照一个降序return pq[i].Age > pq[j].Age
}
func (pq AgePQ) Swap(i, j int) {pq[i], pq[j] = pq[j], pq[i]
}// 两个队列独有的方法
func (pq *AgePQ) Push(x any) {item := x.(*Person)*pq = append(*pq, item)
}
func (pq *AgePQ) Pop() any {if pq.Len() == 0 {return nil}last := (*pq)[pq.Len()-1]*pq = (*pq)[:(pq.Len() - 1)]return last
}// 简单的int组成的优先队列
type PQ_of_int []intfunc (pq PQ_of_int) Len() int {return len(pq)
}
func (pq PQ_of_int) Less(i, j int) bool {// 这里是一个升序return pq[i] < pq[j]
}
func (pq PQ_of_int) Swap(i, j int) {pq[i], pq[j] = pq[j], pq[i]
}
func (pq *PQ_of_int) Push(x any) {*pq = append(*pq, x.(int))
}
func (pq *PQ_of_int) Pop() any {if pq.Len() == 0 {return nil}last := (*pq)[pq.Len()-1]*pq = (*pq)[:pq.Len()-1]return last
}

主要测试了两个优先队列,一个队列是针对Person结构体,第二个队列单纯就是int切片

需要注意以下几个点:

1、pop和push行为最好不要直接调用,而是借助heap.Pop()这样的方法

2、pop行为可能在js当中表示删除数组的最后一个值,这里pop行为是可以自定义的,我将pop行为定义成删除队列最后的值,而真实运行起来,却是删除队列的Top值,比如这里的PQ_of_int,我在Less方法之中定义的是一个升序,但是最后pop出来的确实12356这样的顺序,可能这里有些说法我不是很清楚


http://www.ppmy.cn/news/1521055.html

相关文章

论文速读|BiGym:一款基于演示的移动双手操作机器人基准

项目地址&#xff1a;BiGym: A Demo-Driven Mobile Bi-Manual Manipulation Benchmark BiGym 是一个针对移动双手操作的机器人学习基准&#xff0c;包含 40 个在家庭环境中进行的任务&#xff0c;如简单的目标接近到复杂的厨房清洁。这些任务涵盖了从固定的目标接近到需要与各种…

SprinBoot+Vue新生报到微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

SpringBoot中使用Redis-Lettuce

SpringBoot中使用Redis-Lettuce 配置pom在application.properties配置Redis参数协议参数设置序列化参数设置实现工具Redis操作工具类单条数据测试批量测试 在SpringBoot中一般直接引用spring-boot-starter-data-redis这个starter来使用Redis&#xff0c;其中具体实现方式有两种…

【自动驾驶】控制算法(八)横向控制Ⅰ | 算法与流程

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

聊聊Redis分布式锁的八大坑

前言 在分布式系统中&#xff0c;由于redis分布式锁相对于更简单和高效&#xff0c;成为了分布式锁的首先&#xff0c;被我们用到了很多实际业务场景当中。 但不是说用了redis分布式锁&#xff0c;就可以高枕无忧了&#xff0c;如果没有用好或者用对&#xff0c;也会引来一些…

matlab二维热传导显示有限差分法计算(代码)

% 参数设置 x00; % x起点y00; % y起点Lx 1; % x方向长度 Ly 1; % y方向长度 Nx 100; % x方向网格数 Ny 100; % y方向网格数 dx (Lx-x0) / Nx; % x方向步长 dy (Ly-y0) / Ny; % y方向步长 alpha 0.01; % 热扩散率 dt 0.01; % 时间步长 T 1; % 总时间 nt …

Samba服务

samba 服务 一、简介 Samba 是一种在 Linux 和 Unix 系统上实现 SMB&#xff08;Server Message Block&#xff09;协议的服务&#xff0c;其目的是提供文件和打印服务。它可以让 Windows、Linux 和 Unix 之间实现文件和打印机的共享&#xff0c;并且支持通过 SMB/CIFS 协议进…

海外媒体发稿:排名靠前的Vents杂志网站发布新闻通稿-大舍传媒

海外媒体发稿&#xff1a;排名靠前的Vents杂志网站发布新闻通稿 近日&#xff0c;知名海外媒体Vents杂志网站发布了最新一期新闻通稿&#xff0c;涵盖了音乐、娱乐、新闻等多个领域的热点事件。作为一家自2009年成立以来便致力于为全球读者提供第一手资讯的在线媒体&#xff0…

深入解析Spring Boot中的`@Transactional`注解

一、Transactional注解概述 1.1 什么是Transactional Transactional是Spring框架中用于声明式事务管理的注解。通过在方法或类上添加Transactional注解&#xff0c;Spring会自动将该方法或类中的数据库操作纳入到事务管理中&#xff0c;从而保证这些操作的原子性、一致性、隔…

ES6中try-catch

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;try-catch 语句的语法和使用方式与在之前的ECMAScript版本中是一样的。try-catch 语句用于处理代码中可能发生的错误&#xff0c;确保程序的健壮性和用户体验。 基本语法 try { // 尝试执行的代码块 // 如果发生…

Chrome 浏览器插件获取网页 window 对象(方案二)

前言 最近有个需求&#xff0c;是在浏览器插件中获取 window 对象下的某个数据&#xff0c;当时觉得很简单&#xff0c;和 document 一样&#xff0c;直接通过嵌入 content_scripts 直接获取&#xff0c;然后使用 sendMessage 发送数据到插件就行了&#xff0c;结果发现不是这…

TCP如何关闭连接(详细版)

关闭连接的⽅式通常有两种&#xff0c;分别是 RST 报⽂关闭和 FIN 报⽂关闭。 如果进程异常退出了&#xff0c;内核就会发送 RST 报⽂来关闭&#xff0c;它可以不⾛四次挥⼿流程&#xff0c;是⼀个暴⼒关闭连接的⽅式。 安全关闭连接的⽅式必须通过四次挥⼿&#xff0c;它…

uniap app跳转小程序

微信开放平台申请账号并认证配置APP的相关配 其中安卓的包名可以通过反编译工具查看链接 https://download.csdn.net/download/u010843503/88725345d打开后 其中md5就是签名&#xff0c;复制后把中间空格取消就行。 微信开放平台绑定小程序 绑定后查看微信小程序的原始id也…

win11+vscode+Flutter 开发环境配置

https://blog.csdn.net/Oven_maizi/article/details/126804404 1 vscode插件 安装 安装红框中的两个 2 flutter sdk 安装 dart sdk 包含在flutter sdk 里面&#xff0c;路径&#xff1a;flutter_windows_3.24.1-stable\flutter\bin\cache\dart-sdk 方式1&#xff1a; 通过…

CSS中表示长度的单位有哪些?有什么区别?

CSS中有px、em和rem三个长度单位。px是固定像素&#xff0c;不随页面大小变化&#xff1b;em和rem是相对长度单位&#xff0c;em相对于父元素&#xff0c;rem相对于根元素&#xff08;html&#xff09;。 在响应式布局中&#xff0c;rem更常用&#xff0c;因为它只有一个参照物…

Ansible与Docker集成:实现容器化运维自动化

Ansible与Docker集成&#xff1a;实现容器化运维自动化 在现代 DevOps 和云原生环境中&#xff0c;Ansible 和 Docker 是两种非常受欢迎的工具。Ansible 专注于配置管理和任务自动化&#xff0c;而 Docker 则通过容器化技术实现应用的轻量级隔离和部署。将 Ansible 和 Docker …

基于udp的socket网络编程

套接字 网络套接字 原始套接字 unix套接字 windows下SOCKET 为整数。 协议家族 套接字种类 协议 udpServer.cc #pragma warning(disable:4996) #include<iostream> #include<string> #include<cstdlib> #include<WinSock2.h>#pragma comment(li…

mac电脑里面的 磁盘分区,容器,宗卷,宗卷组的理解和使用

在mac电脑里面我们一般都是使用宗卷&#xff0c;他和我们常见的pc机器硬盘的分区是有区别的。 对于物理硬盘来说 不管是分区还是宗卷&#xff0c;他们都是逻辑上面的概念。 分区 mac电脑里面的分区 和 pc电脑中的分区差不多&#xff0c; 他们都是针对的物理硬盘&#xff0c;…

Java 方法的特性详解

目录 一、引言 二、方法的重载 &#xff08;一&#xff09;定义与作用 &#xff08;二&#xff09;判断方法相同的标准 三、可变个数形参的方法 &#xff08;一&#xff09;使用场景 &#xff08;二&#xff09;格式与特点 &#xff08;三&#xff09;代码示例 四、方…

【大模型】llama系列模型基础

前言&#xff1a;llama基于transformer架构&#xff0c;与GPT相似&#xff0c;只用了transformer的解码器部分。本文主要是关于llama&#xff0c;llama2和llama3的结构解读。 目录 1. llama1.1 整体结构1.2 RoPE1.3 SwiGLU 激活函数 2. llama22.2 GQA架构2.3 RLHF 3. llama3参考…