- 2024-11-08洛谷题单指南-二叉堆与树状数组-P1168 中位数
原题链接:https://www.luogu.com.cn/problem/P1168题意解读:中位数就是位于中间的数,前1个数的中位数是第1个,前3个数的中位数是第2个,前5个数的中位数的第3个...以此类推。所以,此题本质上就是动态维护一组数,每1/3/5...等奇数个取第k小的数,取一次后k++。解题思路:要动态维护数据,且每
- 2024-11-05洛谷题单指南-二叉堆与树状数组-P1801 黑匣子
原题链接:https://www.luogu.com.cn/problem/P1801题意解读:动态维护一组序列,并随时可以求第k小的值,每次求第k小的顺序是递增的,比如第一次取第1小,然后是第2小,以此类推。解题思路:对于求第k小的问题,已经介绍过几种方案:1、快选算法,每次查询时间复杂度logn,传送门:https://www.cnblogs
- 2024-11-05洛谷题单指南-二叉堆与树状数组-P3378 【模板】堆
原题链接:https://www.luogu.com.cn/problem/P3378题意解读:实现二叉堆。解题思路:二叉堆本质上一棵完全二叉树,根节点称为堆顶,根据特性不同分为有两种:大根堆:所有父节点的值大于子节点,根节点最大小根堆:所有父节点的值小于子节点,根节点最小主要作用:动态维护序列,并快速找到最大/最
- 2024-11-01【排序算法】堆排序
堆排序堆的认识1、什么是堆在堆排序中,堆是一种特殊的二叉树,它满足以下两个条件一颗完全二叉树,按照整体从上到下,同一层从左到右的顺序排列,不包括平衡树。当父节点的值≥左右孩子的值,根节点的值为最大值时称为大根堆或大顶堆,反之称为小根堆(小顶堆)。2、堆的性质堆的存储
- 2024-09-26【算法】贪心+堆排序实现大根堆及标准库容器类的融合使用
- 2024-09-15「数组」堆排序 / 大根堆优化(C++)
目录概述核心概念:堆堆结构数组存堆思路算法过程up()down()Code优化方案大根堆优化Code(pro)复杂度总结概述在「数组」快速排序/随机值优化|小区间插入优化(C++)中,我们介绍了三种基本排序中的冒泡排序与分治思想结合的算法:快速排序。本文我们来讲第二种基本排
- 2024-09-09P1801 黑匣子
链接:https://www.luogu.com.cn/problem/P1801题目:思路:非常有意思的双根对顶堆。具体来说就是一个大根堆+一个小根堆,然后不断淘汰,用大根堆当基底,每次输出小根堆的top并放到大根堆中。代码:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineIOSio
- 2024-08-23堆Heap
堆堆本质上是一个完全二叉树,一般分为大根堆和小根堆。大根堆:父节点的值大于或等于子节点的值小根堆:父节点的值小于或等于子节点的值堆的操作插入将值插入到堆空余位置,保持完全二叉树,然后开始比较插入值和当前父节点的大小,根据大根堆和小根堆进行节点之间的交换删除一般是
- 2024-08-07大根堆
/*@lcapp=leetcode.cnid=215lang=java[215]数组中的第K个最大元素*///@lccode=startclassSolution{privateint[]smallHeap;intlen=0;voidswap(intidx1,intidx2){inttmp=smallHeap[idx1];smallHeap[idx1]=smallHeap[idx2];smallH
- 2024-08-05大根堆和小根堆的介绍
堆(Heap)的基本概念堆是一种完全二叉树(CompleteBinaryTree),其性质使得堆可以高效地支持以下操作:插入(Insert):将一个新元素加入到堆中。删除最大/最小元素(DeleteMax/Min):移除并返回堆中的最大(大根堆)或最小(小根堆)元素。获取最大/最小元素(GetMax/Min):返回堆中的最大(大根堆)或最小(小
- 2024-08-02【数据结构】大根堆和小根堆
大根堆实现逻辑从整棵树的最后一颗子树开始调整,每次都让根节点和左右孩子去比较,如果根节点比左右孩子的最大值要小,那么就将这两个值进行交换,然后此时这颗子树变成了大根堆,再看下一颗树然后对下一颗树进行相同的处理方法,后面的子树依次交换:当每棵子树都是大根堆的情况
- 2024-07-15大根堆的实现
publicstaticvoidswap(int[]arr,inti,intj){arr[i]=arr[i]^arr[j];arr[j]=arr[i]^arr[j];arr[i]=arr[i]^arr[j];}//建一个大根堆publicstaticclassMyMaxHeap{privateint[]heap;privatefinalintlimit;privateinthea
- 2024-05-31堆排序(Heap sort)
堆排序堆排序是简单选择排序的改进,改进点为如何让减少在选择的过程中比较的次数。1.堆的定义 堆是具有以下性质的完全二叉树:每个结点的值都大于(小于)等于其孩子节点的值,称为大根堆(小根堆)。例: 由堆的定义得知堆顶元素一定为最大(大根堆)或者最小值(小根堆)。
- 2024-03-19【堆排序】(大根堆)
敬信仰赤诚,敬少年滚烫的情钟voidheapify(inta[],intn,inti){//根据当前节点i进行堆调整,保证以i为根节点的子树符合最大堆的性质intlargest=i;//假设当前节点为最大值的索引intleft=2*i+1;//计算左孩子节点索引intright=2*
- 2024-02-12对顶堆
介绍用来求解第K大的数,首先用一个大根堆维护那些小于第K大数的数字,用小根堆来维护第K大以及比第K大还大的数字。若想求解第K大数,直接访问小根堆的堆顶即可,当小根堆的堆的数量小于K时,将大根堆的数字从堆顶以此插入小根堆(因为大根堆中根节点是最大的数字,而大根堆的数均比小根堆的
- 2024-01-22Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)
题意简述有一个以\(1\)为根的有根树,每个点有权值\(v_i\)。你需要选出一个点集\(S\),使得点集里任意两个元素\(x,y\),若\(x\)在原树上是\(y\)的祖先,则要满足\(v_x>v_y\)。求选出的点集的最大大小是多少。解法原题限制相当于:在选出的点集构成的新树\(T\)中,每个点到根节
- 2024-01-19912.排序数组--堆排序
1.题目介绍给你一个整数数组nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]2.题解2.1堆排序思路题目给了我们一个vector数组,要使用堆排序,我们首先要创建一个大根堆,再在这个大根堆的基础上对数
- 2023-12-14python heapq 模块
堆的概念堆是用数组表示的二叉树,分为大根堆和小根堆:大根堆是堆顶元素最大的堆,小根堆是堆顶元素最小的堆 堆的建立堆用列表来表示。在往堆中加入元素时,在列表最后加入一个元素并与其父节点比较(n/2位置)看是否需要进行交换,然后层层比较直到根节点pythonheapq#建立小根堆
- 2023-12-10大根堆和小根堆
#include<iostream>usingnamespacestd;inth[1000000];intz=0;//z表示数列中有几个元素voidup(intx){ while(x>1&&h[x]<h[x/2]){ swap(h[x],h[x/2]); x/=2; }}voiddown(intx){ while(x*2<=z){ intt=x*2; if(t+1<=z&&
- 2023-12-06第14章. 堆
堆(Heap)堆(Heap)是一种树状的数据结构(不要跟内存模型中的"堆空间"混淆),常见的堆实现:堆的一个重要性质:任意节点的值总是>=(或<=)子节点的值:如果任意节点的值总是>=子节点的值,称为最大堆、大根堆、大顶堆如果任意节点的值总是<=子节点的值,称为最小堆、小根堆、小顶堆最
- 2023-11-262023年11月第四周总结
堆堆是一种完全二叉树,也是一种优先级队列堆分为大根堆和小根堆,大根堆即对于每一颗树,它的父亲节点的值,一定大于它的孩子节点的值,左右节点的值不用管它的顺序。小根堆同理。写了一道可以用堆这种数据结构求解的题目,即找数组中第k大的数,要求时间复杂度为O(N)。力扣题目链接解题思
- 2023-10-29大根堆/小根堆
#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<random>#include"util.h"usingnamespacestd;structPoint{intx,y;//priority_queue<Point>大根堆需要重载小于号boolo
- 2023-09-30堆的应用
前言本文针对CSP-S2/NOIP复习,重点在在哪用、怎么写,底层原理和实现不是重点。堆的概念和应用情景堆是一种可以在\(O(\logn)\)的时间内维护一个最值的数据结构,维护最大值的称为大根堆,维护最小值的称为小根堆。堆的应用只有一个,就是求最值,但求什么最值、求出最值后怎么用,需
- 2023-09-13剑指 Offer 41. 数据流中的中位数
classMedianFinder{public:/**initializeyourdatastructurehere.*///注意小根堆的定义方式priority_queue<int,vector<int>,greater<int>>up;//小根堆,默认放从大到小后一半的数priority_queue<int>down;//大根堆,默认放从小到大排序前一半