077二项式堆(Binomial Heap)
二项式堆Binomial Heap— 支持高效合并的森林型优先队列077二项堆一个用二进制计数的数据结构5W1H 发明者故事Who何人- 发明者是谁发明者Jean Vuillemin让·维耶曼背景Jean Vuillemin 是法国著名计算机科学家INRIA法国国家信息与自动化研究所研究员他在算法理论和数据结构领域做出了多项基础性贡献他还是 VLSI 计算复杂性领域的重要学者曾在 MIT 和斯坦福访问研究1978 年他在 Communications of the ACM 发表论文A data structure for manipulating priority queues正式提出二项式队列When何时- 什么时候发明的时间1978年论文发表于 Communications of the ACMCACM时代背景1970 年代末是优先队列理论研究的活跃时期左倾堆Crane, 1972已能实现 O(log N) 合并但实现较复杂研究者希望找到概念更清晰、操作更规整的合并型优先队列同一时期Tarjan 和 Sleator 正在研究摊销分析方法Where何地- 在哪里发明的地点法国INRIAInstitut National de Recherche en Informatique et en Automatique环境INRIA 是欧洲最重要的计算机科学研究机构之一法国学者在算法和数据结构理论上有深厚积累与苏联和美国并列为三大重镇1970 年代欧洲计算机科学研究获得政府大力支持What何事- 发明了什么数据结构二项式队列Binomial Queue/ 二项式堆Binomial Heap核心组成二项式树Binomial Tree的有序森林二项式树 Bk 的递归定义B₀单个节点Bk将一棵 Bk-1 作为另一棵 Bk-1 的根的最左子树B0 B1 B2 B3 o o o o | /\ /|\ o o o o o o | |\ | o o o o | o二项式堆的结构由若干不同阶的二项式树组成的森林每种阶至多一棵N 个节点的堆恰好使用 N 的二进制表示中为 1 的各阶树例如N131101₂则包含 B3、B2、B0Why何因- 为什么发明要解决的问题需要一种比左倾堆更系统、更易于分析的合并型优先队列基于二进制计数的类比使得操作的正确性更直观支持 decrease_key 操作用于 Dijkstra 等图算法理论依据Bk 恰好有 2^k 个节点高度为 kN 个节点的二项式堆最多有 ⌊log₂N⌋1 棵树合并类比于二进制加法同阶树合并进位O(log N) 步完成插入是将单节点堆B₀与原堆合并当时的挑战证明二项式树的结构性质节点数、高度、各层节点数设计高效的链表表示使合并操作真正达到 O(log N)正确实现 extract_min 后的堆重建How何果- 如何实现有什么影响合并算法类比二进制加法将两个堆按树的阶从小到大对齐 逐阶处理类似二进制加法的进位 - 若某阶只有一棵树直接放入结果 - 若某阶有两棵树合并较大根成为另一树的子树产生进位到下一阶 - 若某阶有三棵树进位两堆各一棵其中一棵直接放入结果另两棵合并进位各操作时间复杂度操作最坏时间摊销时间insertO(log N)O(1)find_minO(log N)O(log N)extract_minO(log N)O(log N)mergeO(log N)O(log N)decrease_keyO(log N)O(log N)历史影响直接启发了斐波那契堆Fredman Tarjan, 1984斐波那契堆将 insert 和 decrease_key 的摊销代价降至 O(1)二项式堆至今是教科书中讲授摊销分析的标准例子CLRS 第 19 章在实践中由于常数因子小且实现简单二项式堆有时优于斐波那契堆今天的使用Dijkstra 最短路径算法的实现decrease_key 操作Prim 最小生成树算法作业调度系统中的优先级队列C STL 的一些优先队列变体自然语言需求定义需求名称实现二项式堆支持插入、查找最小、删除最小、合并两堆、减小 key 值功能需求用精确的中文描述合并/联合merge/union将两个二项式堆合并为一个输入两个堆的根链表头指针操作按阶归并两个树列表类比二进制加法处理进位同阶两树合并堆性质较大根成为较小根的子树输出合并后的堆链表头指针插入insert向堆中插入一个新 key输入堆的根链表头指针的指针、整数 key操作创建单节点 B₀ 堆与原堆执行 merge输出无就地更新根指针查找最小find_min返回堆中所有树的根中最小的 key输入堆的根链表头指针操作遍历所有树的根节点返回最小 key输出最小 key若堆为空返回 INT_MAX删除最小extract_min删除并返回最小 key输入堆的根链表头指针的指针操作找到最小根所在的树将其从链表移除将该树的子树反转后与剩余堆合并输出被删除的最小 key统计节点数size返回堆中节点总数输入堆的根链表头指针操作遍历所有树每棵 Bk 有 2^k 个节点输出节点总数约束条件每棵二项式树的根链表按阶degree从小到大排列每棵树满足最小堆性质父节点 key 子节点 key各阶至多出现一棵树类比二进制各位唯一同阶两树合并时较大 key 的根成为较小 key 的根的子树leftmost child验收标准表格编号测试场景自然语言描述预期结果验证方式1插入序列 [4,1,8,3,7,2]依次 extract_min得到有序序列 1,2,3,4,7,8断言每次 extract_min 结果正确2合并堆 {1,5,9} 和堆 {2,3,8}依次 extract_min得到 1,2,3,5,8,9断言每次结果正确3插入 6 个元素后 size 返回 66断言等于 64插入 1 个元素后 find_min 返回该元素插入值断言5插入 [4,1,8,3,7,2] 后 find_min 返回 11断言等于 16空堆 extract_min 返回 INT_MAXINT_MAX断言7插入 8 个元素N81000₂应只有 B₃堆中只有一棵 degree3 的树断言树链表长度为 18合并两个各含 4 个元素的堆均为 B₂结果为含 8 个元素的 B₃degree3 的树断言C语言实现文件对应文件:binomial_queue.c编译运行:gcc-stdc99-Wall-obinomial_queue_test binomial_queue.c ./binomial_queue_test核心函数:bq_merge(h1, h2)— 合并两个二项式堆返回新链表头bq_insert(heap, key)— 插入 keybq_find_min(heap)— 查找最小值bq_extract_min(heap)— 删除并返回最小值bq_size(heap)— 返回节点总数bq_free(heap)— 释放所有节点内存

相关新闻

保险行业实时报表:Kafka到HBase的Spark流处理全链路实践

保险行业实时报表:Kafka到HBase的Spark流处理全链路实践

简介:面向大数据开发与Spark学习者的保险行业实时数据分析实战项目包,基于Kafka、Spark Streaming与HBase构建完整数据管道,演示数据库变更实时同步、实时聚合统计与报表查询等典型场景,适合希望掌握实时计算全链路开发的初中级工…

2026/10/12 15:03:40 阅读更多 →
MiniCPM-o 4.5 实时多模态实战:Omni-Flow 全双工架构与端侧部署调优

MiniCPM-o 4.5 实时多模态实战:Omni-Flow 全双工架构与端侧部署调优

1. 从“能听能看能说”说起:MiniCPM-o 4.5 到底解决了什么问题第一次看到“实时能听能看能说”这个描述的时候,我脑子里蹦出来的不是某个炫酷的 Demo,而是一个很具体的场景:你对着屏幕说话,它一边听你讲,一…

2026/10/11 19:01:31 阅读更多 →
数字IC设计全流程实战:从RTL到GDSII的关键工具链解析

数字IC设计全流程实战:从RTL到GDSII的关键工具链解析

作为在这行摸爬滚打了十几年的老工程师,我经常在社区里被新人问到同一个问题:学校里学了数电、Verilog,自己也写得出简单的模块,但一提到真正跑一个完整的数字IC项目,尤其听到Synopsys工具链里的VCS、DC、ICC、Calibre…

2026/10/11 19:03:21 阅读更多 →

最新新闻

编译原理实验一词法分析器:从状态图到Token识别的全解析

编译原理实验一词法分析器:从状态图到Token识别的全解析

简介:北邮编译原理课程词法分析器实验的完整源码包,面向正在学习编译原理的本科生,以编译器前端的关键环节为切入点,帮助理解扫描器如何将源代码字符流拆分为记号,并识别关键字、标识符、常量、运算符等词素。包内共4个…

2026/10/12 15:02:42 阅读更多 →
麒麟V10 ARM离线部署K8S 1.26.15多主多从集群实战

麒麟V10 ARM离线部署K8S 1.26.15多主多从集群实战

简介:这份资源合集面向需要在国产化平台上落地云原生环境的运维与架构人员,聚焦Kylin V10操作系统与ARM架构CPU组合下,使用containerd作为容器运行时部署Kubernetes 1.26.15多主多从高可用集群的完整实践。包内共47个文件,以gz离线…

2026/10/12 15:02:42 阅读更多 →
C#调用L2CS-Net实现工业级人脸朝向估计

C#调用L2CS-Net实现工业级人脸朝向估计

简介:本资源是一套基于C#与OpenCvSharp实现L2CS-Net人脸朝向估计的完整工程实践方案,面向具备基础C#开发能力及计算机视觉兴趣的中高级开发者,解决实时眼睛注视方向与人脸三维朝向联合估计的技术落地问题,适用于人机交互、注意力分…

2026/10/12 15:02:42 阅读更多 →
KCF目标跟踪算法Python复现:从循环移位到频域相关滤波的工程实践

KCF目标跟踪算法Python复现:从循环移位到频域相关滤波的工程实践

简介:这份压缩包提供KCF(核化相关滤波)目标跟踪算法的Python复现源码,面向计算机视觉初学者、目标跟踪方向研究者,以及希望快速上手相关滤波类算法的开发者。资源共13个文件,以.py源码为核心,辅…

2026/10/12 15:02:42 阅读更多 →
Python图书推荐系统源码解析:协同过滤与文本相似度融合实战

Python图书推荐系统源码解析:协同过滤与文本相似度融合实战

简介:这是一套面向Python初学者与Web开发练手者的图书推荐系统完整源码,基于协同过滤与文本相似度算法实现个性化推荐,适合作为毕业设计、课程设计或推荐算法入门项目。压缩包共1828个文件,以1653张jpg与56张png图片资源、55个htm…

2026/10/12 15:02:42 阅读更多 →
Linux命令查阅与文件操作实战:man、--help、apropos及ls、cp、mv、rm避坑指南

Linux命令查阅与文件操作实战:man、--help、apropos及ls、cp、mv、rm避坑指南

1. 为什么命令查阅能力比死记硬背更重要刚接触Linux那会儿,我跟很多人一样,抱着厚厚一本命令手册从第一页开始啃。结果呢?背了忘,忘了背,真正上机操作时脑子里一片空白。后来带我的前辈说了一句话点醒了我:…

2026/10/12 15:01:42 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →