别再用暴力排序了!大小顶堆让「取极值」效率飙升至 O (log n)

【教程4>第3章>第1节】通信系统高阶调制解调概述 高阶调制(High Order Modulation)是一种先进的数字调制技术,旨在通过增加每个符号携带的信息比特数来提高无线通信系统的数据传输速率和频谱效率。这种技术特别适用于具有较高信噪比(Signal-to-Noise Ratio, SNR)的通信环境,例如卫星通信、光纤通信以及一些高质量的无线通信链路。在数字通信中,调制是将数字信号(比特流)转换为适合在物理信道上传输的模拟信号的过程。高阶调制通过使用更多的信号状态或星座点来表示不同的比特组合,从而在一个符号周期内传输更多的信息。 阅读详情

大小顶堆:原理、实现与应用

堆(Heap)是一种基于完全二叉树的数据结构,核心特性是 “父节点与子节点的优先级关系固定”。根据优先级规则的不同,可分为大顶堆和小顶堆,二者是实现 “Top K 问题”“优先级队列” 等场景的核心工具。

一、核心定义:大顶堆 vs 小顶堆

堆的本质是 “完全二叉树”(除最后一层外,每一层节点数均满;最后一层节点从左到右排列),但需满足以下优先级规则:

类型

核心规则(父节点 vs 子节点)

关键特性

大顶堆

父节点的值 大于等于 其左右子节点的值

根节点是整个堆的 最大值

小顶堆

父节点的值 小于等于 其左右子节点的值

根节点是整个堆的 最小值

示例(数组存储堆)

完全二叉树可通过数组高效存储(无需指针,通过索引计算父子关系),假设数组索引从 0 开始:

  • 父节点索引 i 的左子节点:2*i + 1
  • 父节点索引 i 的右子节点:2*i + 2
  • 子节点索引 j 的父节点:(j - 1) // 2

以数组 [5,3,4,1,2] 为例:

  • 对应大顶堆的完全二叉树:根为 5,左子树 3(子节点 1、2),右子树 4(无后代),满足 “父≥子”。
  • 若数组为 [1,2,4,5,3],则对应小顶堆,根为 1(最小值),满足 “父≤子”。

二、堆的核心操作(以大顶堆为例)

堆的关键操作需保证 “操作后仍满足堆的优先级规则”,核心包括插入和删除堆顶,时间复杂度均为 O(log n) (n 为堆的大小,操作需沿树的高度调整)。

1. 插入操作(Heap Insert)

新元素先加入堆的末尾(数组最后一位),再通过 “向上调整(Heapify Up)” 恢复堆结构:

  1. 将新元素放到数组末尾(完全二叉树的最后一个位置)。
  1. 比较该元素与父节点:若为大顶堆且新元素 > 父节点,则交换二者。
  1. 重复步骤 2,直到该元素≤父节点(或成为根节点),堆结构恢复。

2. 删除堆顶操作(Extract Max/Min)

堆顶(根节点,最大 / 最小值)删除后,需用末尾元素补位,再通过 “向下调整(Heapify Down)” 恢复堆结构:

  1. 取出堆顶元素(根节点),将数组末尾元素移到根节点位置。
  1. 比较该元素与左右子节点:若为大顶堆,找出左右子节点中的最大值,若该元素 < 最大值,则交换二者。
  1. 重复步骤 2,直到该元素≥所有子节点(或成为叶子节点),堆结构恢复。

三、经典应用场景

大小顶堆的核心价值是 “快速获取极值”,因此广泛用于需优先处理 “最大 / 最小” 元素的场景:

场景

堆的选择

核心逻辑

Top K 问题

小顶堆(求 Top K 大)大顶堆(求 Top K 小)

求 “前 K 个最大元素”:用容量为 K 的小顶堆,遍历元素时,比堆顶大则替换堆顶,最终堆内即 Top K。

优先级队列

大顶堆 / 小顶堆

按优先级处理任务:如 “最高优先级任务先执行” 用大顶堆(优先级为键),“时间最早任务先执行” 用小顶堆(时间为键)。

中位数查找

大顶堆 + 小顶堆

大顶堆存 “左半部分较小元素”(堆顶为左半最大,即中位数候选),小顶堆存 “右半部分较大元素”,动态维持两堆大小平衡。

堆排序

大顶堆

1. 将数组构建为大顶堆;2. 反复删除堆顶(放到数组末尾)并调整堆,最终数组升序排列。

四、Python 实现(以小顶堆为例)

Python 标准库 heapq 仅提供小顶堆的实现,若需大顶堆,可通过 “存入负数” 间接实现(取元素时再转负)。

1. 小顶堆基础操作(heapq)

import heapq
# 1. 初始化堆(将列表转化为小顶堆,in-place操作)
heap = [3, 1, 4, 2]
heapq.heapify(heap)  # 转化后:[1, 2, 4, 3](满足小顶堆规则)
# 2. 插入元素(自动向上调整)
heapq.heappush(heap, 0)  # 插入后:[0, 1, 4, 3, 2]
# 3. 删除并返回堆顶(最小元素,自动向下调整)
min_val = heapq.heappop(heap)  # 返回0,堆变为[1, 2, 4, 3]
# 4. 查看堆顶(不删除)
print(heap[0])  # 输出1(当前堆顶)

2. 大顶堆实现(间接方式)

通过 “存储元素的负数”,利用小顶堆的逻辑实现大顶堆效果:

import heapq
# 初始化大顶堆(存入负数)
max_heap = [-3, -1, -4, -2]
heapq.heapify(max_heap)  # 转化后:[-4, -2, -3, -1](小顶堆的“小”对应原数的“大”)
# 插入元素(存负数)
heapq.heappush(max_heap, -0)  # 插入后:[-4, -2, -3, -1, 0]
# 删除并返回堆顶(原数的最大值,取负后返回)
max_val = -heapq.heappop(max_heap)  # 返回4,堆变为[-3, -2, 0, -1]
# 查看堆顶(原数的最大值)
print(-max_heap[0])  # 输出3

五、关键总结

  1. 结构本质:堆是 “完全二叉树” 的数组实现,核心是 “父节点与子节点的固定优先级关系”。
  1. 操作效率:插入、删除堆顶的时间复杂度均为 O (log n),远优于 “直接排序后取极值” 的 O (n log n)。
  1. 场景适配:求极值、Top K、优先级队列用堆;Python 需注意 heapq 仅支持小顶堆,大顶堆需间接实现。
  1. 局限性:堆仅能高效获取 “堆顶极值”,若需查找任意元素,效率为 O (n)(需遍历数组),此时需结合哈希表等结构优化。

PON架构(全光网络) 目前组网架构世界上有一种最快的速度又是光,以前传统以太网络规划满足不了现在的需求。有线网 无线网 全光网络方案场景 全光网络分类 以太全光网络 PON(Pas-sive-Optical Network 无源光网络) 再典型的中大型高校网络中 推荐万兆入室 千兆到桌面的带宽设计 一般三层 (终端-接入层-汇聚层-核心层-出口(安全设备)-互联网) 单校区核心设备 一般采用两台高性能的核心交换机 双机的方式采用的是 M-LAG 多校区之间核心交换机采用1 阅读详情

相关推荐

PSpice 导入 LTspice 仿真实验 --(如何解决PSpice模型无法使用的错误)

参考了网上第三方器件导入LTspice的博客和资料,不论是哪个公司下载的SPICE模型导入LTspice的方法都类似。如果遇到导入报错的情况可以先看一下报错提示,如果通过语法修改实现功能的则说明可以进行仿真,当然性能可能与官方给的模型存在一点出入,但做一个基本的功能验证本人认为还是可以的,总比做出板子用不了或者完全不匹配的要好一些。

伊丽莎白的学习之路 9007

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 354

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

把 KV Cache 压到 FP4:BitDecoding-FP4 的算法-系统协同设计复盘

长上下文推理卡在KV Cache的显存与带宽上,而现有FP4方案要么精度崩、要么速度废。这篇文章复盘BitDecoding-FP4如何用三个算法补丁加一个系统重构,在B300上把服务吞吐提升2.4–3.0倍,精度几乎不掉。

helloagent的博客 312

vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法

背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。

qq_43573047的博客 2946

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充

本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。

weixin_29102619的博客 524

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 333

Netty UDP

UDP是一种无连接的协议,它并不在通信双方之间建立连接,而是直接将数据包从发送端发送到接收端。UDP不保证数据包的可靠传输,也不保证数据包的顺序,因此其传输速度通常比TCP快,且系统开销较小。然而,这也意味着UDP在某些情况下可能会丢失数据包或数据包到达的顺序错乱。

王小工小工历程 2028

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 606

美军利用MANET技术实现无人作战单元协同作战

本文首先介绍了移动自组织网络 (MANET)以及Wave Relay®波形中继技术,并探讨了波形中继MANET平台在美空军ABMS项目等军事方面的运用情况。

guanyifu9的博客 858

手把手教你学simulink(44.1)--串励直流电动机场景示例:基于Simulink开发一个串励直流电动机电压控制仿真模型

高启动转矩:由于励磁绕组和电枢绕组串联连接,电机在启动时可以产生较大的转矩。速度随负载变化:由于励磁电流和电枢电流是同一电流,电机的速度会随着负载的变化而显著变化。适用于重载启动:适合用于需要高启动转矩的应用,如起重机、牵引系统等。

MHD0815的博客 341

优选算法:分治-归并排序

交易逆序对的总数

Wangshijie1015的博客 148

人工智能算法面试大总结-总目录

涉及秋招、春招、社招

啥都生的博客 2万+

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 24

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

408 算法 06|堆与 Top-K:最小的 10 个数,到底该用数组还是堆

2022(42) 找 100 万个数里最小的 10 个,官方给了"10 元素有序数组"和"大根堆"两种答案。我把两种都实现并数了比较次数:k=10 时两者几乎打平,k=10000 时堆少 111 倍。另附 2021(42) 计数排序的比较次数与稳定性实测。

m0_56226131的博客 440

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 426

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 174

算法64,字母异位词分组

代码核心思路是:互为字母异位词的字符串,在对其字符进行排序后,一定会得到相同的字符串。因此,可以将排序后的字符串作为哈希表的键(Key)来进行分组。

sheshibenniaodan的博客 203

【MPC 算法】Python 实战:模型预测控制(MPC)算法原理与代码实现

本文介绍模型预测控制(MPC)原理与Python实现。MPC通过滚动优化预测未来状态,结合系统模型、目标函数与约束条件,动态生成最优控制序列。以一阶温度系统为例,使用CVXPY构建凸优化问题,实现加热功率的智能调控。代码包含模型预测、目标函数设计(含温度跟踪与控制平滑惩罚)、输入约束及滚动更新机制。仿真结果表明,MPC能快速稳定温度至目标值60℃,且控制动作平滑合理,体现其在复杂系统中的优越性。

赖德发的博客 51

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 223

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 181

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 205

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 375

算法62&&63,存在重复元素

判断整数数组中是否有任意元素出现至少两次。:判断数组中是否存在两个。,且索引差值的绝对值。

sheshibenniaodan的博客 100

商业综合体公摊电费分摊算法:512 商户双层权重与尾差实测

公摊电费分摊算法是指把公共回路电量按公示权重拆到每户的规则化计算过程,核心不是权重多精巧,而是每张账单都能被租户手算复现。某珠三角商业综合体 512 户商户实测:固定费与变动费按 4:6 加权,尾差用余数递补压到 0.01 千瓦时精度,24 个月 12288 张账单重算差异为零,月度争议从 31 起降到 2 起。适用边界:商铺与租户已独立装表、公共回路已分项计量的商业综合体适用;末端未装表、靠总表减合计倒推公摊的场景不适用,先把表补齐再谈分摊。

173

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 52
上一篇: 正则表达式:为什么它成了程序员的 “分水岭”?
下一篇: 【数据结构与算法】———深度优先:“死磕 + 回头” 的艺术
程序员职业指南
博客等级 码龄4年 2138粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值