算法之堆的应用(优先队列)

算法之Java优先队列:堆实现与进阶应用解析 在编程学习的道路上,数据结构与算法的掌握至关重要。今天,我们一同深入研究Java中的优先队列,特别是基于堆的实现方式及其进阶应用,希望能和大家共同进步,提升我们在算法领域的认知与实践能力! 阅读详情

简介

堆(Heap)是一个可以被看成近似完全二叉树的数组。树上的每一个结点对应数组的一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。—— 来自:《算法导论》

堆包括最大堆和最小堆:最大堆的每一个节点(除了根结点)的值不大于其父节点;最小堆的每一个节点(除了根结点)的值不小于其父节点。

堆常见的操作:

HEAPIFY 建堆:把一个乱序的数组变成堆结构的数组,时间复杂度为 O ( n ) O(n) O(n)。
HEAPPUSH:把一个数值放进已经是堆结构的数组中,并保持堆结构,时间复杂度为 O ( l o g   n ) O(log\ n) O(log n)。
HEAPPOP:从最大堆中取出最大值或从最小堆中取出最小值,并将剩余的数组保持堆结构,时间复杂度为 O ( l o g   n ) O(log\ n) O(log n)。
HEAPSORT:借由 HEAPFY 建堆和 HEAPPOP 堆数组进行排序,时间复杂度为 O ( n   l o g   n ) O(n\ log\ n) O(n log n),空间复杂度为 O ( 1 ) O(1) O(1)。
堆结构的一个常见应用是建立优先队列(Priority Queue)。

例题

以上题目均来自 leetcode 和 牛客网.

解析

23. 合并K个升序链表

题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例 1:

输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到。
1->1->2->3->4->4->5->6

分析

  1. 分治合并。略
  2. 优先队列。创建最小堆,按照链表节点的值建立优先级,开始时将每个链表的头节点放入优先队列,每次从堆中弹出堆顶元素,合并到结果中,然后将下一个节点入堆,直到堆为空。
    时间复杂度:链表个数为k,每个链表长度为 n n n,堆大小为 k k k,所以每次插入和删除的时间复杂度为 O ( l o g   k ) O(log\ k) O(log k),一共有 k n kn kn 个节点入堆和出堆,所以总的时间复杂度为 O ( k n ∗ l o g   k ) O(kn*log\ k) O(kn∗log k)
    空间复杂度为 O ( k ) O(k) O(k)

代码

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        PriorityQueue<ListNode> heap = new PriorityQueue<>((x, y) -> x.val - y.val);
        for (int i = 0; i < lists.length; i++) {
            if (lists[i] != null) {
                heap.add(lists[i]);
            }
        }
        ListNode dummy = new ListNode(-1), cur = dummy, node;
        while (!heap.isEmpty()) {
            node = heap.poll();
            cur.next = node;
            cur = cur.next;
            if (node.next != null) {
                heap.add(node.next);
            }
        }
        return dummy.next;
    }
}

215. 数组中的第K个最大元素

题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

分析

  1. 优先队列。求第k个最大元素,建立小顶堆,维护堆大小为k,超过k就弹出堆顶元素。当遍历完数组之后,堆中留下的就是最大的k个元素,堆顶就是第k个最大元素。
    时间复杂度: O ( n l o g   k ) O(nlog\ k) O(nlog k)
    空间复杂度: O ( k ) O(k) O(k)
  2. 快排思想。 O ( n ) O(n) O(n)解法,略。

代码

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        for (int i = 0; i < nums.length; i++) {
            heap.add(nums[i]);
            if (i >= k) {
                heap.poll();
            }
        }
        return heap.peek();
    }
}

239. 滑动窗口最大值

题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例 1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置    最大值
---------------            -----
[1 3 -1] -3 5 3 6 7    3
1 [3 -1 -3] 5 3 6 7    3
1 3 [-1 -3 5] 3 6 7    5
1 3 -1 [-3 5 3] 6 7    5
1 3 -1 -3 [5 3 6] 7    6
1 3 -1 -3 5 [3 6 7]    7

分析

  1. 优先队列。建立最大堆,堆里存储的元素包含nums的索引和值,按照值的大小建立优先级。依次遍历nums中元素,入堆,同时检查堆顶元素是否在窗口之内,窗口之外的直接弹出,碰到窗口之内的加入答案集合。
    时间复杂度:极端情况下nums升序排列,堆的大小最大为n,所以插入和删除的时间复杂度为 O ( l o g   n ) O(log\ n) O(log n),加上遍历nums每个元素的复杂度,总时间复杂度为 O ( n l o g   n ) O(nlog\ n) O(nlog n).
    空间复杂度: O ( n ) O(n) O(n).
  2. 单调队列。 O ( n ) O(n) O(n)解法,略

代码

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        if (n == 0 || k == 0) {
            return new int[0];
        }
        int[] res = new int[n - k + 1];
        PriorityQueue<int[]> heap = new PriorityQueue<>((x, y) -> y[0] - x[0]);
        
        for (int i = 0; i < n; i++) {
            heap.add(new int[]{nums[i], i});
            if (i >= k - 1) {
                while (heap.peek()[1] <= (i - k)) {
                    heap.poll();
                }
                res[i - k + 1] = heap.peek()[0];
            }
        }
        return res;
    }
}

264. 丑数 II

题目描述

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

分析

  1. 优先队列。维护一个最小堆,最开始放入堆的元素是1,然后每次弹出堆顶元素,剩以2,3,5后再入堆。同时维护一个HashSet过滤重复元素。这样第n次弹出的元素就是所求的第n个丑数。
    时间复杂度: O ( n   l o g   n ) O(n\ log\ n) O(n log n)
  2. 动态规划。 O ( n ) O(n) O(n) 解法,略。

代码

class Solution {
    public int nthUglyNumber(int n) {
        PriorityQueue<Long> heap = new PriorityQueue<>();
        Set<Long> seen = new HashSet<>();
        heap.add(1L);
        seen.add(1L);
        int[] factors = {2, 3, 5};

        long res = 0;
        for (int i = 0; i < n; i++) {
            res = heap.poll();
            for (int f : factors) {
                long v = f * res;
                if (!seen.contains(v)) {
                    heap.add(v);
                    seen.add(v);
                }
            }
        }
        return (int)res;
    }
}

295. 数据流的中位数

题目描述

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。

示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2

分析

  1. 两个优先队列。维护一个大顶堆maxHeap和一个小顶堆minHeap,并且maxHeap和minHeap的大小要么相等,要么maxHeap比minHeap大一,并且大顶堆维护的是最大的数,小顶堆维护的是最小的数。这样中位数就是maxHeap的堆顶元素或者是两个堆顶元素的平均数。
    时间复杂度:addNum:O(logn),findMedian:O(1)

代码

class MedianFinder {

    PriorityQueue<Integer> minHeap;
    PriorityQueue<Integer> maxHeap;
    /** initialize your data structure here. */
    public MedianFinder() {
        minHeap = new PriorityQueue<>();
        maxHeap = new PriorityQueue<>((x, y) -> y - x);
    }

    public void addNum(int num) {
        if (minHeap.size() != maxHeap.size()) {
            maxHeap.add(num);
            minHeap.add(maxHeap.poll());
        } else {
            minHeap.add(num);
            maxHeap.add(minHeap.poll());
        }
    }

    public double findMedian() {
        if (minHeap.size() != maxHeap.size()) {
            return maxHeap.peek() + 0.0;
        } else {
            return (maxHeap.peek() + minHeap.peek()) / 2.0;
        }
    }
}
Python 算法基础篇:堆和优先队列的实现与应用 堆和优先队列是常用的数据结构,它们在算法和程序设计中有着广泛的应用。本篇博客将重点介绍堆和优先队列的原理、实现以及它们在不同场景下的应用。我们将使用 Python 来演示堆和优先队列的实现,并通过实例展示每一行代码的运行过程。 阅读详情

相关推荐

17、优先队列与堆:排序算法及扩展应用

本文深入探讨了优先队列与堆在排序算法中的核心作用,重点介绍了堆排序的原理及其O(n log n)的时间复杂度优势,并对比了选择、插入等传统排序算法。文章还讲解了自底向上的堆构建方法(heapify),其时间复杂度仅为O(n),并扩展了优先队列的功能,引入比较器和定位器以增强通用性与操作灵活性。通过详尽的练习题解析,涵盖强化、创新与实际应用场景,如中位数维护、事件模拟、股票订单处理等,展示了堆在现实问题中的高效应用。结合性能对比表格与流程图,全面呈现了不同实现方式的优劣,帮助读者深入理解并掌握相关算法设计思想

rrr55的博客 40

堆的应用--优先队列

01什么是堆Law1. 堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都是O(logn),用堆实现的优先级队列虽然和数组实现相比较删除慢了些,但插入的时间快的多了。当速度很重要...

故事凌 451

堆数据结构在优先队列中的应用及其对算法效率的影响

本章节详细介绍了堆数据结构在优先队列中的应用,包括最大堆和最小堆的概念、堆的选择操作以及如何通过堆实现有效的排序算法。通过对堆操作复杂度的分析,探讨了堆数据结构在解决特定问题(如分数背包问题)中的优势,以及它如何简化贪心算法的实现并可能提高其实用效率。

weixin_42590539的博客 446

【算法笔记】堆的应用

堆的几个重要的应用,它们分别是:优先级队列、求 Top K 问题和求中位数问题。优先级队列是一; 优先级队列是一种特殊的队列,优先级高的数据先出队,而不再像普通的队列那样。求 Top K 问题又可以分为针对静态数据和针对动态数据,只需要利用一个堆,就可以做到非常高效率的查询 Top K 的数据; 求中位数实际上还有很多变形,比如求 99 百分位数据、90 百分位数据等,处理的思路都是一样的,即利用两个堆,一个大顶堆,一个小顶堆,随着数据的动态添加,动态调整两个堆中的数据,最后大顶堆的堆顶元素就是要求的数据。

qq_41286360的博客 676

SQL2000在Win10上安装完整指南:兼容模式、SP4补丁与远程连接配置

数据库兼容性是老系统迁移与运维中绕不开的难题。当历史遗留的SQL Server 2000遭遇全新的Windows 10环境,安装程序常因系统版本检测失败而拒绝运行,这背后是旧版安装程序与NT内核版本间的识别错位。通过兼容模式模拟旧系统环境、以管理员身份运行安装程序,并处理注册表挂起与杀毒软件干扰,即可突破基础安装障碍。安装后的SP4补丁与TCP/IP端口配置,则是保障服务稳定与远程连接的关键。这一技术路径广泛适用于制造企业MES、进销存系统及医院HIS等仍依赖老旧数据库的场景,为IT运维与数据迁移测试提供了

weixin_29266679的博客 437

数据结构-详解优先队列的二叉堆(最大堆)原理、实现和应用-C和Python

一、堆的基础 1.1 优先队列和堆 优先队列(Priority Queue):特殊的“队列”,取出元素顺序是按元素优先权(关键字)大小,而非元素进入队列的先后顺序。 若采用数组或链表直接实现优先队列,代价高。依靠数组,基于完全二叉树结构实现优先队列,即堆效率更高。一般来说堆代指二叉堆。 优先队列的完全二叉树(堆)表示 1.2 堆 堆序性: 父节点元素值比孩子节点大(小) 最大堆(M...

SHIDA优快云的博客 2319

把外部系统一键装进 SAP Build Work Zone:从零开始创建 HTML5 URL App

HTML5 URL App 是一种轻量级解决方案,可将外部网页或系统入口快速集成到SAP企业门户中。开发者只需在manifest.json中配置目标URL、导航模式等参数,无需开发完整前端应用。该方案利用SAP BTP的HTML5 Application Repository集中存储静态资源,通过HTML5 Apps Content Provider将应用暴露给子账号,最终在SAP Build Work Zone中以Fiori磁贴形式呈现。文章详细介绍了manifest.json的关键配置、三种基础设施组件

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 241

优先队列在算法设计中的应用

与普通队列不同的是,在优先队列中,具有较高优先级的元素会被优先处理。优先队列是一种强大的数据结构,在许多算法中发挥了重要作用,如 Dijkstra 算法和 A* 搜索算法。通过优先队列,我们可以有效地处理和优化这些算法中的关键操作,提高计算效率和性能。优先队列在 Dijkstra 算法中用于选择当前路径最短的节点,从而高效地更新其他节点的最短路径。它结合了 Dijkstra 算法的优点和贪心算法的启发式方法,优先考虑目标方向。大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!

微赚开发者技术分享博客 408

1.07---共识机制详解(PoW、PoS、DPoS 对比)

【摘要】区块链能成为“无需信任的协作网络”,靠的正是它的“共识机制”。本节将深入剖析 PoW、PoS、DPoS 等核心共识模型,并结合以太坊从 PoW 到 PoS 的转型与 Solana 等新型方案,为你拆解这一决定区块链运行方式、性能、安全性的“发动机系统”。什么是共识机制?为何不是多数投票这么简单?三大主流共识算法(PoW、PoS、DPoS)机制对比与演化路线以太坊从 PoW 到 PoS 的转型细节(The Merge)Solana 的 PoH + PoS 混合共识机制解析。

鄙人kunzhi96,感恩遇见! 1万+

深入解析逆时偏移(RTM)算法及其在C++中的实现

逆时偏移(Reverse Time Migration, RTM)是一种高级地震成像技术,广泛应用于地震勘探中。RTM通过逆时传播波场来构建地震子波,能够提供更高分辨率和更精确的地下构造图像。本文将详细介绍RTM的基本原理,并通过C++代码示例,深入解析如何实现和优化RTM算法。希望这篇文章能够为地球物理学家和C++开发者提供有价值的参考。

qq_38334677的博客 1526

【C++】优先队列

优先队列是一种抽象数据结构,定义了插入、删除和获取最大/最小元素等操作。堆是一种具体的数据结构,可以用来实现优先队列。堆是一个近似完全二叉树,并且满足堆序性质:父节点的值总是大于(或小于)子节点的值。二叉堆是一种特殊的堆,完全二叉树,通常用数组表示。二叉堆很适合实现优先队列,时间复杂度为O(logn。优先队列强调数据元素的优先级与排序,堆提供了一种数据结构来高效实现这一功能。参考文献[1]张铭,王腾蛟,赵海燕编著,《数据结构与算法》,高等教育出版社,2008.6。

xixin2233的博客 541

HTML流光爱心(完整代码)

HTML语言实现红蓝色流光爱心效果的完整代码。

AIGC 1万+

C/C++ 入门核心算法:堆的企业级应用 之 堆实现优先队列

观看本系列博文提醒: 你将学会堆的原理 和 算法实现; 一个企业级应用:堆实现优先队列; 还有堆排序; 最后还有一道检测是否掌握堆算法的作业。 这已经是本系列博文的第二篇了,还没看过第一篇博文:C/C++ 入门核心算法大局观:堆 的朋友可以点击下面链接去了解一下。 https://blog.youkuaiyun.com/cpp_learner/article/details/105599877 由于本篇...

cpp_learner的博客 332

咨询进阶——解读40页公司战略解码方法【附全文阅读】

战略解码是将企业战略转化为可执行计划的关键过程,强调垂直和水平一致性原则。通过KPI指标设计和目标分解,确保战略在各部门和岗位有效落地。解码过程包括战略澄清、目标牵引、绩效分解和承诺签订,输出战略解码图等文件。不同部门根据责任定位(如利润中心、绩效中心)采用差异化考核方式,实现战略有效执行。

cdfunlove的博客 149

099、多摄融合与变焦系统:广角到长焦的无缝切换算法

本文分享了多摄融合与变焦系统开发中的实战经验和关键挑战。作者通过一个旗舰机项目案例,揭示了广角到长焦切换时画面抖动问题的根源——融合算法误将视差当作运动补偿,并提出"视差冻结窗口"的解决方案。文章总结了三大多摄融合难点:物理视差处理、亮度差异补偿和切换时机把控,详细阐述了分层架构设计、融合权重计算等核心技术。同时强调了产线校准的重要性,并给出五项实用建议:允许边缘鬼影保留、参数场景化配置、加强产线检测、完善调试接口,以及合理运用AI技术。全文展现了多摄融合技术在时间、空间和感知维度上的复杂平衡艺术。

sundong_81的博客 45

Java基于优先队列的贪心算法_堆和堆的应用:堆排序和优先队列

1.堆堆(Heap))是一种重要的数据结构,是实现优先队列(PriorityQueues)首选的数据结构。由于堆有很多种变体,包括二项式堆、斐波那契堆等,但是这里只考虑最常见的就是二叉堆(以下简称堆)。堆是一棵满足一定性质的二叉树,具体的讲堆具有如下性质:父节点的键值总是不大于它的孩子节点的键值(小顶堆),堆可以分为小顶堆和大顶堆,这里以小顶堆为例,其主要包含的操作有:insert()extrac...

weixin_32541333的博客 362

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

STL在算法设计中的应用——优先队列作为堆

优先队列作为堆 STL在算法设计中的应用有如下几种: Ⅰ.存放主数据 Ⅱ.存放临时数据 Ⅲ.检测数据元素的唯一性 Ⅳ.数据的排序 ⭐Ⅴ.优先队列作为堆 此篇主要内容就是 Ⅴ.优先队列作为堆 在有些算法设计中用到堆,堆采用STL的优先队列来实现,优先级的高低由队列中数据元素(比较运算符)确定,很多情况下需要重载关系函数。 一、元素为内置类型的堆 ①对于C/C++内置数据类型,默认是以less<T>(小于关系函数)作为关系函数,值越大优先级越高(即大根堆),可以改为greater<T&gt

#两个西柚 472

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

obsidian-local-gpt RAG配置完整指南:Ollama Embedding 模型 nomic-embed-text 与 bge-m3 怎么选

obsidian-local-gpt 是 Obsidian 的本地 AI 助手插件,配合 Ollama 即可完全离线、私密地使用 GPT 类模型。它的 RAG(✨增强操作)功能会自动收集笔记的链接、反向链接和 PDF 内容,用 Embedding 模型检索出最相关的片段注入提示词。本文手把手教你完成 RAG 配置,并讲清楚两个 Ollama Embedding 模型——nomic-embed-te

gitblog_00203的博客 638

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

最小优先队列,并结合之前的上下文(循环队列、单链表、双链表、数组列表、栈、优先队列、循环缓冲区、二叉最小堆、斐波那契堆、二叉最大堆、堆排序、快速排序、二项式最小堆、并行算法应用、分布式任务调度

最小优先队列,并结合之前的上下文(循环队列、单链表、双链表、数组列表、栈、优先队列、循环缓冲区、二叉最小堆、斐波那契堆、二叉最大堆、堆排序、快速排序、二项式最小堆、并行算法应用、分布式任务调度、并行图算法),我假设您希望深入探讨最小优先队列的实现,重点分析其在半导体产线场景中的应用,并与之前讨论的数据结构和算法(特别是二项式最小堆、斐波那契堆等)进行对比。二、二项式最小堆作为最小优先队列的实现以下是基于二项式最小堆的最小优先队列实现,扩展了之前的代码,支持线程安全,适用于并行和分布式场景。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 736

并行算法应用,并结合之前的上下文(循环队列、单链表、双链表、数组列表、栈、优先队列、循环缓冲区、二叉最小堆、斐波那契堆、二叉最大堆、堆排序、快速排序、二项式最小堆的对比),我假设您希望探讨二项式最小堆

并行算法应用,并结合之前的上下文(循环队列、单链表、双链表、数组列表、栈、优先队列、循环缓冲区、二叉最小堆、斐波那契堆、二叉最大堆、堆排序、快速排序、二项式最小堆的对比),我假设您希望探讨二项式最小堆在并行算法中的应用,特别是在半导体产线场景中,并与之前讨论的数据结构和算法进行对比。二、二项式最小堆在并行算法中的示例代码以下是基于二项式最小堆的并行任务调度实现,结合 C# 的 System.Threading.Tasks 实现并行优先队列调度。(2) 二项式最小堆 vs 二叉最小堆/最大堆。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 852

算法导论之堆的应用---优先队列

今天为大家介绍的是堆的另一种应用,优先队列,之前也为大家介绍过堆排序,今天则主要介绍优先队列,优先队列和堆一样也有两种形式:最大优先队列和最小优先队列,这里,我们关注于如何基于最大堆实现最大优先队列。优先队列(priority queue)是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字(key),一个最大优先队列支持以下操作:      heap_m

ooooo12345re的博客 484

Gemini永久会员 堆(Heap)特殊的完全二叉树结构,常用于实现优先队列,并在数据排序、图算法(如Dijkstra、Prim)等领域广泛应用

堆(Heap)是一种特殊的完全二叉树结构,常用于实现优先队列,并在数据排序、图算法(如Dijkstra、Prim)等领域广泛应用。: 虽然每个下沉操作是O(log n),但大部分节点位于堆底层,高度较小,整体复杂度通过数学推导为O(n)。: 堆仅保证根节点极值,不保证左右子树有序;BST要求左子树所有节点 < 根 < 右子树所有节点。堆通过高效的插入和删除操作,在动态数据场景中表现优异,是算法设计中重要的数据结构之一。: 堆和二叉搜索树(BST)的区别?: 为什么建堆时间复杂度是O(n)?

m0_37843156的博客 419

算法学习笔记--堆的常见应用优先队列

优先队列:有两种形式,最大优先队列和最小优先队列优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字。优先级队列支持的操作:Insert(S,x):把元素x 插入集合中Maximum(S):返回具有最大键值的元素Extract-Max(S):去掉并返回S中的具有最大键值的元素。Increase(S,x,k).将元素的关键字值增加到k,这里的k值不小于...

qq_26566749的博客 240
上一篇: 算法leetcode 彻底搞懂LRU和LFU缓存问题
下一篇: 算法多线程leetcode题目总结(多解法实现)
Elmerr
博客等级 码龄12年 178粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值