加强堆(大根堆)

way:看上去好像就是加了个indexMap记录节点在数组heap中的下标,然后就是可以查到某个元素是否在堆里并且可以进行位置的调整,普通的堆是没法知道元素是不是在的,只能弹堆顶元素,插入到堆尾这样子。如果觉得heapSize有点混淆的话,可以heapSize处理之后再去做操作,不用++,--搞得不明白。知道方法的实现过程就好啦,swap在交换时同步修改indexMap,remove把remove的元素和最后的交换,要remove的元素在最后,再调整在 i 位置处的end元素就可以了。heapInsert和heapify和普通堆相比都多了index参数。

成员: vector<Node *> heap, map<Node *, int> indexMap, int heapSize, comp对象比较函数(我没用,可以根据情况看要不要)。

方法:构造,bool isEmpty,int size,bool contains,Node * top,void push(Node * node),Node * pop,void remove(Node * node),void resign(Node *node),void heapInsert(int index),void heapify(int index),void swap(int i, int j),vector<Node *> getAllElements。

#include<iostream>
#include<vector>
#include<map>
using namespace std;typedef int T;struct Node
{T val;Node(T val){this->val = val;}
};//这回不限制大小了哈哈哈
class MyMaxHeap
{
private:vector<Node*>heap;map<Node*, int>indexMap;int heapSize;public:MyMaxHeap(){heapSize=0;}bool isEmpty(){return heapSize==0;}int size(){return heapSize;}bool contains(Node *node){return indexMap.count(node)>0;}Node *top(){if(isEmpty()) return nullptr;return heap[0];}void push(Node *node){heap.push_back(node);heapSize++;indexMap[node]= heapSize-1;heapInsert(heapSize-1);}//这个swap函数在交换的同时把indexMap也悄悄的交换了void swap(int i, int j){Node *a = heap[i];Node *b = heap[j];indexMap[a]=j;indexMap[b]=i;heap[i]=b;heap[j]=a;}void heapInsert(int index){//从index位置开始向上浮动int fa = (index-1)/2;while(heap[index]->val > heap[fa]->val){swap(index, fa);index = fa;fa = (index-1)/2;}}Node *pop(){//要删除堆顶的元素Node *del = heap[0];//最后一个元素//Node *end = heap[heapSize-1];//交换之后要删除的数在堆尾,堆尾的元素在0位置处待处理swap(0, heapSize-1);//先处理要删除的元素heap.pop_back();indexMap.erase(del);heapSize--;//再处理在0位置的元素heapify(0);return del;}void heapify(int index){int left = 2*index+1;//从index位置开始往下沉while(left < heapSize){int maxChild = (left+1<heapSize && heap[left+1]->val > heap[left]->val)? left+1:left;if(heap[index]->val > heap[maxChild]->val){break;}swap(index, maxChild);index = maxChild;left = 2*index+1;}}void remove(Node *node){Node *end = heap[heapSize-1];int i = indexMap[node];//交换要移除的元素和最后一个元素的位置swap(i, heapSize-1);//此时要移除的元素在最后,最后一个元素在i位置上//处理要移除的元素heap.pop_back();indexMap.erase(node);heapSize--;//处理在i位置上的元素resign(end);}void resign(Node *node){int index = indexMap[node];//可能往上浮heapInsert(index);//也可能往下沉heapify(index);}vector<Node *>getAllElements(){return heap;}
};int main()
{MyMaxHeap heap;vector<Node*>nodes;nodes.push_back(new Node(1));nodes.push_back(new Node(2));nodes.push_back(new Node(3));nodes.push_back(new Node(4));nodes.push_back(new Node(5));nodes.push_back(new Node(6));for(auto node:nodes){heap.push(node);}cout<<"堆顶元素是"<<endl;cout<<heap.top()->val<<endl;cout<<"移除元素6"<<endl;heap.remove(nodes[5]);cout<<"堆顶元素是"<<endl;cout<<heap.top()->val<<endl;cout<<"移除元素5"<<endl;heap.remove(nodes[4]);cout<<"堆顶元素是"<<endl;cout<<heap.top()->val<<endl;system("pause");return 0;
}

 可以和普通大根堆对比着看实现过程。手写堆(大根堆)-CSDN博客

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

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

相关文章

PCIE协议-4-物理层逻辑模块

4.1 简介 物理层将事务层和数据链路层与用于链路数据交换的信令技术隔离开来。物理层被划分为逻辑物理层和电气物理层子模块&#xff08;见图4-1&#xff09;。 4.2 逻辑物理层子模块 逻辑子模块有两个主要部分&#xff1a;一个发送部分&#xff0c;它准备从数据链路层传递过…

Spring 中常用的手动装载 bean 方法

在 Spring 的 bean 装载条件中&#xff0c;虽然 Spring 给我们提供了非常好用便捷的 Condition 相关注解&#xff0c;但是很多时候 Condition 相关注解并不满足我们的需求&#xff0c;我需要更复杂的条件手动控制是否装置 bean。这个时候我们就可以实现 Spring 为我们提供的几个…

域名DNS添加CAA记录

目录 概述 检测CAA记录 添加CAA记录 概述 DNS CAA(Certificate Authority Authorization)记录是一种不太常见的DNS记录类型,它主要用于锁定证书颁发机构(CA)列表,以确保只有特定的CA可以为某个域名颁发SSL/TLS证书。CAA记录是保护域名免受钓鱼攻击的安全措施,通过限制…

v-md-editor和SSE实现ChatGPT的打字机式输出

概述 不论是GPT还是文心一言&#xff0c;在回答的时候类似于打字机式的将答案呈现给我们&#xff0c;这样的交互一方面比较友好&#xff0c;另一方面&#xff0c;当答案比较多、生成比较慢的时候也能争取一些答案的生成时间。本文后端使用express和stream&#xff0c;使用SSE将…

Boosting Cache Performance by Access Time Measurements——论文泛读

TOC 2023 Paper 论文阅读笔记整理 问题 大多数现代系统利用缓存来减少平均数据访问时间并优化其性能。当缓存未命中的访问时间不同时&#xff0c;最大化缓存命中率与最小化平均访问时间不同。例如&#xff1a;系统使用多种不同存储介质时&#xff0c;不同存储介质访问时间不同…

【C++初阶】—— 类和对象 (上)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 初步认识C2. 类的引入3. 类的定义声明和定义全部放在类体中声明和定义分开存放 4.…

8个实用网站和软件,收藏起来一定不后悔~

整理了8个日常生活中经常能用得到的网站和软件&#xff0c;收藏起来一定不会后悔~ 1.ZLibrary zh.zlibrary-be.se/这个网站收录了超千万的书籍和文章资源&#xff0c;国内外的各种电子书资源都可以在这里搜索&#xff0c;98%以上都可以在网站内找到&#xff0c;并且支持免费下…

Android系统的/etc/mkshrc文件

/etc/mkshrc 文件是用于配置 mksh&#xff08;MirBSD Korn Shell&#xff09;环境的启动脚本。mksh 是 Android 默认使用的 shell&#xff0c;在 shell 启动时会读取并执行这个文件中的配置。以下是关于 /etc/mkshrc 文件的详细信息及其用途。 /etc/mkshrc 文件的作用 环境配…

sql server专题实验4 复杂查询

SQL Server 是微软开发的数据库管理系统&#xff0c;它支持复杂的查询操作&#xff0c;允许用户从数据库中检索、分析和处理数据。在进行复杂查询时&#xff0c;通常会用到以下几种SQL语句和概念&#xff1a; 连接&#xff08;Join&#xff09;: INNER JOIN&#xff1a;只返回两…

设计模式--备忘录模式

备忘录模式是一种行为设计模式&#xff0c;它用于在不破坏封装的前提下&#xff0c;保存一个对象的内部状态&#xff0c;以便以后可以恢复到这个状态。这种模式在许多应用场景中非常有用&#xff0c;例如在实现撤销操作、保存游戏进度、恢复文件备份以及保持工作状态等。 备忘…

linux中ansible整理笔记

一、工作模式 1. adhoc临时命令 语法&#xff1a; ansible 主机或者组列表 -m 模块 -a “参数” 2. playbook 语法&#xff1a; ansible-playbook xxx.yml 二、模块 1. ping 2.command:默认模块&#xff08;不支持重定向&#xff0c;管道&#xff09; 3.shell:类似com…

IP地址显示“不安全”怎么办|已解决

解决IP地址显示“不安全”的问题&#xff0c;通常需要确保网站或服务使用HTTPS协议进行加密通信&#xff0c;可以通过部署SSL证书来解决&#xff0c;以下是具体的解决步骤&#xff1a; 1 申请IP地址SSL证书&#xff1a;网站管理员应向证书颁发机构&#xff08;CA&#xff09;申…

网络拓扑—WEB-IIS服务搭建

文章目录 WEB-IIS服务搭建网络拓扑配置网络IISPC 安装IIS服务配置IIS服务&#xff08;默认站点&#xff09;PC机访问网页 配置IIS服务&#xff08;新建站点&#xff09;PC机访问网页 WEB-IIS服务搭建 网络拓扑 //交换机忽略不计 IIS服务IP&#xff1a;192.168.1.1 PC机IP&…

人类交互2 听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号&#xff0c;从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一&#xff0c;对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉&#xff0c;我们能够听到他人的语言…

安装错误提示Please run MaterialLibrary2018.msi first或者其他MaterialLibrary版本

打开autoremove&#xff0c;系统检查&#xff0c;点击开始检查。检查完成修复。 可以解决部分该问题&#xff0c;如果没解决的请咨询

Linux中的文件描述符

1.系统调用接口和库函数的关系 函数&#xff1a;fopen fclose fread fwrite 都是c标准库当中的函数&#xff0c;也就是用户操作接口中ibc系统调用&#xff1a;open close read write 都是系统调用提供的接口 c语言中接口底层封装的都是系统调用接口 FILE* stdin stdout stderr…

[POI2008] STA-Station/洛谷P3478(树形dp)

[ P O I 2008 ] S T A − S t a t i o n ( 树形 d p ) \Huge{[POI2008] STA-Station(树形dp)} [POI2008]STA−Station(树形dp) 题目链接&#xff1a;[P3478 POI2008] STA-Station - 洛谷 文章目录 题意思路标程 题意 给定一个 n n n个点的树&#xff0c;请求出一个结点&#…

js无感删除url搜索部分,不刷新页面

如&#xff1a;把下面的网址 http://127.0.0.1:5173/?code3b9cc36e&state 改成 http://127.0.0.1:5173 history.pushState(null, 网站标题, location.origin)

TikTok越狱检测之二 <调试器检测>

来了&#xff0c;调试器检测。总结如下,多多指教: 检测app 是否被附加调试: 原理就是检测父进程是否 launchd启动&#xff0c;在OS X和iOS 系统中&#xff0c;用户环境始于launchd&#xff0c;为用户态出现的第一个进程&#xff0c;为所有的进程的祖先&#xff0c;launchd 的进…

Python模块、包和异常处理

大家好&#xff0c;在当今软件开发领域&#xff0c;Python作为一种简洁、易读且功能强大的编程语言&#xff0c;被广泛应用于各种领域。作为一名测试开发工程师&#xff0c;熟练掌握Python的模块、包和异常处理是提高代码可维护性和错误处理能力的关键。本文将和大家一起探讨Py…