堆(二叉堆)总结-创新互联

一、堆的种类:

(1)小根堆(小堆、最小堆)

站在用户的角度思考问题,与客户深入沟通,找到鹤峰网站设计与鹤峰网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、成都做网站、外贸营销网站建设、企业官网、英文网站、手机端网站、网站推广、域名注册、网络空间、企业邮箱。业务覆盖鹤峰地区。

(2)大根堆(大堆、大堆)

二、一般堆的应用和操作:

(1)插入某个节点

(2)删除任意下标节点

(3)替换任意下标节点

堆的操作有up和down,down 和 up 都是针对下标进行的操作:

#include#include 
using namespace std;
const int N=100010;
int heap[N],size;

void down(int x){
    int t=x;
    if(2*x<=size && heap[t]>heap[2*x]) t=2*x; //前面的<=size是为了保证当前节点存在子节点
    if(2*x+1<=size && heap[t]>heap[2*x+1]) t=2*x+1;
    if(x!=t){
        swap(heap[x],heap[t]);
        down(t);
    }
}

void up(int x){
    while(x/2>0 && heap[x]>heap[x/2]){
        swap(heap[x],heap[x/2]);
        x/=2;
    }
}

int main()
{
    
    return 0;
}

放一道题目:         AcWing 838. 堆排序(已做笔记)

三、堆的变形:

变形之后的堆与一般的堆的不同之处在于可以修改和删除第k(k表示顺序)个插入的节点元素,而不是下标为k的节点元素

#include#include 
using namespace std;
const int N=100010;
int heap[N],size;
int cnt;//用于编号是第cnt个插入的节点
int ph[N];//表示第k个插入的节点在堆中的下标是多少
int hp[N];//表示堆中下标对应的是第几个插入的节点

void heap_swap(int a,int b){//a和b都表示下标
    swap(heap[a],heap[b]);
    swap(ph[hp[a]],ph[hp[b]]);
    swap(hp[a],hp[b]);
}

void down(int x){
    int t=x;
    if(2*x<=size && heap[t]>heap[2*x]) t=2*x;
    if(2*x+1<=size && heap[t]>heap[2*x+1]) t=2*x+1;
    if(x!=t){
        heap_swap(x,t);//注意:这里使用的是下标进行操作,而不是像之前那样只交换值
        down(t);
    }
}

void up(int x){
    while(x/2>0 && heap[x]

对于变形之后的堆,在进行节点的删除和修改的时候都不能只是单纯的进行值覆盖了,而是要用heap_swap()函数对值、下标、第cnt个插入的节点全部进行交换;

放一道题目:        AcWing 839. 模拟堆(一定要认真看这道题!)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章名称:堆(二叉堆)总结-创新互联
文章转载:http://pwwzsj.com/article/dpjjco.html