首页 > 其他分享 >使用数组实现一个小顶堆

使用数组实现一个小顶堆

时间:2023-10-28 13:22:35浏览次数:23  
标签:结点 数组 实现 元素 int heap 操作 小顶

堆也叫优先队列,可以在\(\mathcal{O(1)}\)时间里得到堆中的最小/大元素。堆在各种编程语言中都有实现,c++STL里面有priority_queue,java中是Priority_Queue,python里提供了heapp模块实现对堆的各种操作。
堆可以分为小顶堆和大顶堆,顾名思义,小顶堆堆顶存储堆中的最小值,大顶堆堆顶存储堆中的最大值,下面使用数组模拟一个小顶堆的实现,大顶堆类似。
要实现一个堆,必须具备add操作(往堆中添加元素),peek操作(返回堆顶元素),pop操作(返回堆顶元素并将该元素删除)三个操作,而三个操作又是由up操作和down操作来实现。
up操作将当前元素往上移动,down操作将当前元素往下移动。

class Heap {
    int[] heap = new int[1010];//小顶堆
    int sz = 0;//当前堆中的元素数目
    void swap(int a, int b) {
        int c= heap[a];
        heap[a] = heap[b];
        heap[b] = c;
    }

    void up(int u) {
        int f = u / 2;//当前结点的父结点所对应的下标
        //如果当前结点比父结点小 交换当前结点与父结点 并递归处理父结点
        if(f != 0 && heap[f] > heap[u]) {
            swap(f, u);
            up(f);
        }
    }

    void down(int u) {
        int cur = u;
        int l = u * 2;
        int r = u * 2 + 1;
        //如果当前结点比左/右子结点大 交换当前结点与左/右子结点  并递归处理左/右子结点
        if(l <= sz && heap[l] < heap[cur]) cur = l;
        if(r <= sz && heap[r] < heap[cur]) cur = r;
        if(cur != u) {
            swap(cur, u);
            down(cur);
        }
    }

    void add(int x) {
        heap[++sz] = x;//为方便起见 在数组的末尾添加新元素
        up(sz);
    } 

    int peek() {
        return heap[1];//返回堆顶元素
    }

    int pop() {
        int res = heap[1];
        heap[1] = heap[sz--];//将数组结尾元素移至堆顶
        down(1);
        return res;
    }
}

标签:结点,数组,实现,元素,int,heap,操作,小顶
From: https://www.cnblogs.com/BlueSky2021/p/17793977.html

相关文章

  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记7
    20211306密码系统设计与实现课程学习笔记7任务详情自学教材第4章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......
  • 运维管理软件:网络设备监控的价值与实现
      随着企业业务的不断发展,各种应用系统的不断上线,网络设备的数量和复杂性也在不断增加。在这样的背景下,如何保证网络设备的稳定性和安全性已成为企业必须面对的问题。而网络设备监控作为一体化运维管理软件的重要组成部分,对于提高企业运维管理水平具有重要的意义。本文将围绕监......
  • 手撕Vuex-Vuex实现原理分析
    本章节主要围绕着手撕Vuex,那么在手撕之前,先来回顾一下Vuex的基本使用。创建一个Vuex项目,我这里采用vue-cli创建一个项目,然后安装Vuex。vuecreatevuex-demo选择Manuallyselectfeatures。这里只需要,Babel与Vuex。选择2.X版本的Vue:创建package.json:是......
  • 【小星星直播互动宝】——第一时间回复用户问题,自动语音回复,实现无人值守直播
    无人直播已成为当下热门的互联网趋势,然而,频繁的语音重复和低频互动行为常常影响用户体验,给主播和观众带来不必要的困扰。为了解决这一问题,我们地推出了【小星星直播互动宝】,一款功能强大的无人直播语音交互软件,配合小星星去重播放器,为您带来全新的直播体验! 目前支持平台:快手......
  • 实现 Angular Lazy loading 时应该避免 Static Imports 的原因
    在Angular应用开发中,Lazyloading(懒加载)是一种常用的优化技术,通过Codesplitting(代码拆分)实现。然而,在实现过程中,开发者往往会遇到一些常见的问题。本文将详细介绍在实现AngularLazyloading时应该避免的错误,并提供实际的示例进行说明。避免Lazy-Loaded代码的静态导入......
  • PAT_B1008 数组元素循环右移问题
    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0​A1​⋯AN−1​)变换为(AN−M​⋯AN−1​A0​A1​⋯AN−M−1​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?输入格式:每......
  • C#读取记事本,里面有600万条数据,放入数组时:System.OutOfMemoryException
     原因:使用文件流,然后读取文件内容,再解析的时候,会报内存溢出 处理办法:使用/n分隔///<summary>///通过记事本,获取CRM所有客户的某个字段///</summary>///<returns></returns>publicstaticList<string>GetFieldByText(str......
  • 双网卡 iptables 做网关 实现局域网其它机器上网
    A机器和B机器在同一个局域网,A机器的网卡eno1可以上网,IP为111.111.111.111。A机器的网卡eno2不能上网,IP为:192.168.1.66。B机器不能上网,B机器的网卡eno1IP为192.168.2.80,B机器和eno2IP为192.168.1.80。A机器的eno2和B机器的eno2在同一网段,可以通信,如何实现B机器通过A机器上网?......
  • DSPLearning_day02--卷积、互相关和差分方程求解的matlab实现
    卷积实现\[y(n)=x(n)*h(n)\\y(n)=\sum_{m=-\infin}^{\infin}x(m)h(n-m)\]%确定第一个序列的x轴和y轴坐标nx=[0:1];x=[12];%确定第二个序列的x轴和y轴坐标nh=[0:2];h=[321];%conv是matlab自带的对两个序列进行卷积的函数y=conv(x,h);%注意配好......
  • 实现动态大数结构
      大数结构是一种常见的数据结构,在C++当中,我们常用vector来动态实现。除此之外,我们也可以仿照vector的思路,自己实现内存的动态分配,当内存容量达到上限时,用C-apirealloc进行内存的重新分配。#defineREQUIRE2(p,q)assert((p)||(q))#defineREQUIRE1(p)assert(p)#define......