【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 )

这篇具有很好参考价值的文章主要介绍了【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 )。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

注意点 

代码如下 


【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 ),算法--学习笔记,数据结构,算法,c++

上篇已经详细解释过堆的内容,需要可以回顾一下。

【第十五课】数据结构:堆

这里关注这道题提出几个注意点。 

注意点 

这道题有几个需要注意的点:

①没有事先给出完整的数组,而是靠我们一次次操作进行插入。因此,要定义一个size变量记录插入数据的个数

②对于操作4 5 .要求是删除/修改 “第k个插入的数”。 //这是这道题的重点

由于堆是一种动态变化的数据结构,元素在堆中的位置会随着插入和删除操作的进行而发生改变,所以我们不能简单地将插入的顺序和在堆中的位置直接对应起来,需要通过ph和hp两个数组来进行转换。

因此,我们在交换堆数组中两个数据的时候不能单单只是交换其在数组中的值,还需要更新ph和hp两个数组,以保持元素的  位置信息和插入顺序  的信息始终是正确的(映射关系)

需要着重理解ph和hp两个数组所代表的含义。

ph数组用来记录第k个插入的数在堆数组中的下标,也就是:ph数组的下标,表示的是第几个插入,ph数组的含义是 第k个插入的数在堆数组中的下标。

hp数组用来记录堆数组中的每个元素对应是第几个插入的,也就是:hp数组的下标,表示的是堆数组中元素的下标,hp数组的含义是堆数组中的每个元素对应是第几个插入的。

【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 ),算法--学习笔记,数据结构,算法,c++

代码如下 

#include<iostream>
#include<algorithm>
const int N=1e5+10;
int n,size;
int he[N],ph[N],hp[N];
//size 记录元素个数
//ph数组:存储第k个插入的数 在堆数组中的下标  hp数组:存储 堆里面对应下标的点是 第几个插入的点
using namespace std;

void heap_swap(int a,int b)//a b表示下标 注意传入变量的形式
{
    swap(ph[hp[a]],ph[hp[b]]);
    swap(hp[a],hp[b]);
    swap(he[a],he[b]);
}
void down(int x)
{
    int t=x;//t表示三个数中的最小值
    if(x*2<=size && he[x*2]<he[t])t=x*2;
    if(x*2+1<=size && he[x*2+1]<he[t])t=x*2+1;
    if(x!=t)
    {
        heap_swap(x,t);
        down(t);
    }
}
void up(int x)
{
    while(x/2 && he[x/2]>he[x])
    {
        heap_swap(x/2,x);
        x /= 2;
    }
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        char op[2]={0};
        scanf("%s",op);
        int k,x;
        int i=0;//i被用作ph数组的索引
        if(op[0]=='I')
        {
            scanf("%d",&x);
            size++;
            i++;
            ph[i]=size;
            hp[size]=i;
            he[size]=x;
            up(size);
        }
        else if(op[0]=='P')
        {
            printf("%d\n",he[1]);
        }
        else if(op[0]=='D' && op[1]=='M')
        {
            heap_swap(1,size);
            size--;
            down(1);
        }
        else if(op[0]=='D' && op[1]!='M')
        {
            scanf("%d",&k);
            k=ph[k];
            heap_swap(k,size);
            size--;
            down(k);
            up(k);
        }
        else {
            scanf("%d%d",&k,&x);
            k=ph[k];
            heap_swap(k,size);
            he[k]=x;
            down(k);
            up(k);
        }
    }
    return 0;
}

在明白上篇文章和注意点之后,相信代码很容易理解。


关于堆的问题就先说到这里。

有问题欢迎指出!一起加油!! 文章来源地址https://www.toymoban.com/news/detail-824676.html

到了这里,关于【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介

    🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白 p ia o 的学习空间! 🎉🎉🎉 💖 C++Python所有的入门技术皆在 我的主页 color{#0cc123}{我的主页} 我的主页 :我的主页 1.1.1 利用构造函数Mat中的一些形式完成快速创

    2024年02月06日
    浏览(35)
  • 【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式&数据通信&生产者消费者模型)、动态内存管理、定时器管理

    上一课: 【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步资源同步)、事件标记组(与或多个任务) 下一课: 【小黑嵌入式系统第十六课】PSoC 5LP第三个实验——μC/OS-III 综合实验 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣

    2024年01月17日
    浏览(47)
  • 第二讲:数据结构 AcWing 826. 单链表

    笔试的题目大部分 大部分涉及到链表都是十万级别的 用数组的方式创建链表速度很快,不会超时,而如果用new 一个结构体的话 大部分就是比较慢的 所以不建议使用 数组模拟单链表 单链表在笔试题中用的最多是 领接表 领接表最多的应用是存储数和图 双链表 最多的应用就

    2024年02月19日
    浏览(38)
  • 【AcWing算法基础课】第二章 数据结构(部分待更)

    本专栏文章为本人AcWing算法基础课的学习笔记,课程地址在这。如有侵权,立即删除。 邻接表 :存储图和树 e数组存储每个结点的值,ne数组存储每个结点的指向的下一个结点。 数组模拟链表比较快,指针模拟会涉及到new操作,比较慢。 题目链接 :826. 单链表 1.1题目描述

    2024年02月13日
    浏览(48)
  • AcWing 算法基础课二 数据结构 链表 栈 队列 并查集 哈希表

    链表题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 AcWing. 826.单链表 双链表 AcWing 827.双链表 AcWing 828.模拟栈 AcWing 3302.表达式求值 AcWing 829. 模拟队列 AcWing 830.单调栈 AcWing 154.滑动窗口 AcWing 831. KMP字符串 AcWing 835. Trie字符串统计 AcWing 143. 最大异或对 AcWing 836.合并集合

    2024年02月15日
    浏览(48)
  • 第十五届蓝桥杯模拟赛(第一期)

    大家好,我是晴天学长,本次分享,制作不易,需要的小伙伴可以点赞关注评论一波哦!后续会继续更新第二期第三期的。💪💪💪 问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。 请将这个数的十进制形

    2024年02月04日
    浏览(58)
  • 第十五届蓝桥杯模拟赛(第二期)

    大家好,我是晴天学长,本次分享,制作不易,本次题解只用于学习用途,如果有考试需要的小伙伴请考完试再来看题解进行学习,需要的小伙伴可以点赞关注评论一波哦!后续会继续更新第三期的。💪💪💪 问题描述 小蓝要在屏幕上放置一行文字,每个字的宽度相同。 小

    2024年02月03日
    浏览(83)
  • 数据结构第十一弹---堆

    堆就是以二叉树的顺序存储方式来存储元素,同时又要满足父亲结点存储数据都要 大于等于 儿子结点存储数据(也可以是父亲结点数据都要 小于等于 儿子结点数据)的一种数据结构。堆只有两种即 大堆和小堆 , 大堆就是父亲结点数据大于等于儿子结点数据,小堆则反之。

    2024年02月03日
    浏览(38)
  • 第十五届蓝桥杯模拟赛(第一期 C++)

    问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。    答案: 2730 思路分析: 直接暴力秒了 问题描述 在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母

    2024年02月05日
    浏览(48)
  • 第十五届蓝桥杯模拟赛(第一期)Python

    创作不易,欢迎小伙伴们关注、点赞+收藏! 问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。 请将这个数的十进制形式作为答案提交。 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本

    2024年02月05日
    浏览(64)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包