【Go——实现小堆顶】

1. 堆概念

堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值。

最大堆和最小堆是二叉堆的两种形式。

最大堆:根结点的键值是所有堆结点键值中最大者。

最小堆:根结点的键值是所有堆结点键值中最小者。

2. heap

树的最小元素在根部,为index 0.

heap包对任意实现了heap接口的类型提供堆操作。

heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop取出队列最高优先级的项目。

3. 类型接口

3.1 类型接口

heap包中核心是heap.Interface接口, 堆的基础存储是一个树形结构,可以用数组或是链表实现,通过heap的函数,可以建立堆并在堆上进行操作。

heap.Interface接口源码:

type Interface interface {sort.InterfacePush(x interface{}) // add x as element Len()Pop() interface{}   // remove and return element Len() - 1.
}

sort.Interface接口源码

type Interface interface {// Len is the number of elements in the collection.Len() int// Less reports whether the element with// index i should sort before the element with index j.Less(i, j int) bool// Swap swaps the elements with indexes i and j.Swap(i, j int)
}

在实现了这些接口之后,就可以被heap包提供的各个函数进行操作,从而实现一个堆。

3.2 成员函数

heap包中提供了几个最基本的堆操作函数,包括Init,Fix,Push,Pop和Remove (其中up, down函数为非导出函数)。这些函数都通过调用前面实现接口里的方法,对堆进行操作。

// 一个堆在使用任何堆操作之前应先初始化。接受参数为实现了heap.Interface接口的对象。
func Init(h Interface)
// 在修改第i个元素后,调用本函数修复堆,比删除第i个元素后插入新元素更有效率。
func Fix(h Interface, i int)
// Push和Pop是一对标准堆操作,Push向堆添加一个新元素,Pop弹出并返回堆顶元素,而在push和pop操作不会破坏堆的结构
func Push(h Interface, x any)
func Pop(h Interface) any
// Remove删除堆中的第i个元素,并保持堆的约束性
func Remove(h Interface, i int) any//使用案例
import ("container/heap""fmt"
)hp := &ItemHeap{}
heap.Init(hp)
heap.Push(hp, Item{key: i, value: i})
heap.Pop(hp)

3.3 小堆顶的实现

package mainimport ("container/heap""fmt"
)// 小堆顶
type Item struct {// 排序的关键词,key根据需求修改key int// value,万能的话可以用interface{}value int
}type ItemHeap []Itemfunc (h ItemHeap) Len() int {return len(h)
}func (h ItemHeap) Swap(i, j int) {h[i], h[j] = h[j], h[i]
}func (h ItemHeap) Less(i, j int) bool {// <是小顶堆,>是大顶堆return h[i].key < h[j].key
}// 实现heap.Interface接口定义的额外方法
func (h *ItemHeap) Push(item interface{}) {*h = append(*h, item.(Item))
}// 这个方法不是给用户使用的
func (h *ItemHeap) Pop() interface{} {old := *hn := len(old)x := old[n-1]*h = old[0 : n-1]return x
}func main() {hp := &ItemHeap{}heap.Init(hp)for i := 0; i < 10; i++ {heap.Push(hp, Item{key: i, value: i})}for i := 100; i > 90; i-- {heap.Push(hp, Item{key: i, value: i})}// 输出堆的长度,验证元素已插入fmt.Printf("Heap length: %d\n", hp.Len())//取出最小元素需要使用fmt.Println(heap.Pop(hp))
}

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

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

相关文章

如何保护数据安全?迅软DSE加密系统给信息撑把保护伞!

信息安全当然需要保护&#xff0c;不然企业的信息可以发给任何人&#xff0c;普通信息还好&#xff0c;如果是重要机密呢&#xff0c;企业重要信息被发出去后可能会造成一些麻烦&#xff0c;所以可以使用加密系统&#xff0c;对数据进行安全保护&#xff0c;防止泄密问题&#…

集成学习案例-幸福感预测

集成学习案例一 &#xff08;幸福感预测&#xff09; 背景介绍 此案例是一个数据挖掘类型的比赛——幸福感预测的baseline。比赛的数据使用的是官方的《中国综合社会调查&#xff08;CGSS&#xff09;》文件中的调查结果中的数据&#xff0c;其共包含有139个维度的特征&#xf…

C++ | Leetcode C++题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size(), n matrix[0].size();int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 l…

用一个故事告诉你协程到底是什么

神秘使者 “久闻Java语言跨越平台&#xff0c;框架众多&#xff0c;不过二十年功夫&#xff0c;就已晋升天下第一编程语言&#xff0c;今日一见&#xff0c;果然名不虚传呐&#xff01;” “使者先生您过奖了&#xff0c;咱们快些走&#xff0c;国王陛下已经等候多时了” 今…

STM32的外设总了解

1.NVIC—嵌套向量中断控制器 2.SysTick—系统滴答定时器: 它们是内核里的外设 3.RCC—复位和时钟控制 这个外设十分重要,因为其他的外设再上电的情况下默认是没有时钟的&#xff0c;那么不给时钟的情况下&#xff0c;操作其他外设是无效的&#xff0c;外设不会工作,因此我们需要…

FFmpeg的GPU功能进行视频处理

要使用FFmpeg的GPU功能进行视频处理&#xff0c;你需要确保已经安装了NVIDIA的GPU驱动、CUDA和cuDNN&#xff0c;并且你的FFmpeg版本已经支持GPU加速。以下是一个简化的步骤说明&#xff1a; 安装NVIDIA驱动、CUDA和cuDNN&#xff1a; 首先&#xff0c;你需要安装与你的NVIDI…

Linux进程通信--共享内存

共享内存 共享内存概念 共享内存允许两个或者多个进程共享物理内存的同一块区域&#xff08;通常被称为段&#xff09;。由于 一个共享内存段会成为一个进程用户空间的一部分&#xff0c;因此这种 进程间通信&#xff08;IPC&#xff09; 机制无需内核介 入。所有需要做的就…

ansible——INVENTORY主机清单

一、Inventory主机清单 Inventory支持对主机进行分组&#xff0c;每个组内可以定义多个主机&#xff0c;每个主机都可以定义在任何一个或多个主机组内 二、Inventory主机清单部署 2.1 前期准备 systemctl stop firewalld setenforce 0 yum install epel-release -y yum install…

【知识碎片】2024_05_07

今天记录了两个代码和C的几个破碎知识。 第一段代码是基础型的&#xff0c;关于数组。第二段代码是二分的&#xff0c;一开始没通过全部案例&#xff0c;值得再看。 每日代码 1.记负均正 输入一个数组&#xff0c;输出负数的个数&#xff0c;整数的平均值&#xff08;0都不参…

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

Matlab图像中加入脉冲噪声、高斯噪声并用均值滤波、中值滤波进行滤波处理

一、脉冲噪声和高斯噪声简介 脉冲噪声和高斯噪声是两种常见的信号干扰类型&#xff0c;它们的特性和影响各不相同&#xff1a; 脉冲噪声&#xff08;Impulse Noise&#xff09;&#xff1a; 在图像中&#xff0c;脉冲噪声表现为随机出现的亮点或暗点&#xff0c;这些噪声点通常…

vector介绍与使用【C++】

C vector 前言一、vector的介绍c文档介绍简介 二、vector的定义和使用vector的定义vector代码演示 vector的使用vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题引起底层空间改变eraseg与vs检测比较string迭代器失效 vector 在OJ中的使用只出现…

pandas 预处理

文章目录 第1关&#xff1a;数据读取与合并第2关&#xff1a;数据清洗第3关&#xff1a;数据转换 第1关&#xff1a;数据读取与合并 任务描述 本关任务&#xff1a;加载 csv 数据集&#xff0c;实现 DataFrame 合并。 知识讲解 Pandas 模块导入 import pandas as pd 读取 cs…

物流EDI:GEFCO EDI 需求分析

GEFCO专注于汽车物流领域近70年&#xff0c;是欧洲整车市场的物流供应商&#xff0c;也是欧洲十大领先的运输和物流集团之一。GEFCO的业务遍及六大洲&#xff0c;业务覆盖150个国家&#xff0c;在全球拥有庞大的员工队伍&#xff0c;在全球汽车行业的挑战中茁壮成长。为汽车制造…

WordPress插件:链接自动识别转为超链接

WordPress插件&#xff1a;链接自动识别转为超链接 <?phpfunction open_links_in_new_tab() {add_filter(the_content, make_clickable);function autoblank($text) {$return str_replace(<a, <a target"_blank", $text);return $return;}add_filter(th…

[Scrcpy]数据线连接安卓手机投屏windows电脑[win控制安卓手机]比Samsung Dex好用

配置好&#xff0c;只需要两步即可完成安卓手机投屏windows 第一步&#xff1a;usb线连接windows电脑 第二步&#xff1a;cmd输入投屏命令srccpy 搞定 前言/背景 一些视频资料只能下载到手机&#xff0c;很不喜欢手机那么小屏幕播放&#xff0c;播放很不方便 在家的话可以投…

如何看待2024数维杯?

一、赛事介绍 美赛结束后,2024年又一场高含金量数模竞赛开始报名啦!数维杯每年上半年为数维杯国赛(5月,俗称小国赛),下半年为数维杯国际赛(11月),累计参赛高校千余所,参赛人数超14万人,经过八年多的发展,已成为继数学建模国赛和美赛之后的第三大全国性数学建模赛事,…

phpstudy靶场访问显示404 Not Found

涉及靶场 upload-labd sqli-labs pikachu dvwa 以及所有部署在phpstudy中的靶场 一、检查phpstduy设置 localhost——管理——修改 1、根目录&#xff08;默认设置&#xff0c;不要改&#xff09; localhost这个域名必须保留&#xff0c;并且把根目录设置为phpstudy的WWW文…

mysql优化(慢查询,索引,表结构)

从慢查询优化,索引优化和表结构三个方面入手,进行总结: 慢查询优化 启用慢查询日志&#xff1a;开启慢查询日志&#xff0c;记录执行时间超过阈值的SQL语句&#xff0c;以便后续分析。分析慢查询日志&#xff1a;使用工具&#xff08;如mysqldumpslow&#xff09;或直接查看日…

如何利用AI提高内容生产效率?

要通过AI技术提升内容生产的效率和质量&#xff0c;可以从以下几个方面进行探讨&#xff1a; 1. 自动化内容生成 AI技术可以快速生成大量高质量的文本、图像和音频内容。例如&#xff0c;利用自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;AI可以自动生成新闻报道…