配对堆(Pairing Heap

简介: 配对堆(Pairing Heap)是一种优先队列的数据结构,它的主要特点是每个节点都有两个子节点,分别称为左子节点和右子节点。配对堆中每个节点的优先级都大于等于(或小于等于)其子节点的优先级。它具有以下基本操作:插入、删除、查找最小值、更新最小值和堆化。

配对堆(Pairing Heap)是一种优先队列的数据结构,它的主要特点是每个节点都有两个子节点,分别称为左子节点和右子节点。配对堆中每个节点的优先级都大于等于(或小于等于)其子节点的优先级。它具有以下基本操作:插入、删除、查找最小值、更新最小值和堆化。

使用配对堆时,可以根据需要选择插入、删除或查找最小值等操作。当需要频繁插入和删除数据时,可以使用配对堆。它适用于实时数据处理、缓存和优化问题等场景。

以下是一个使用 Python 实现配对堆的简单示例:

class PairingHeap:
def init(self):
self.heap = []
def insert(self, value):
self.heap.append(value)
self._bubble_up(len(self.heap) - 1)
def delete_min(self):
if not self.heap:
return None
if len(self.heap) == 1:
return self.heap.pop()
min_value = self.heap[1]
self.heap[1] = self.heap.pop()
self._bubble_down(1)
return min_value
def find_min(self):
if not self.heap:
return None
return self.heap[1]
def update_min(self, new_value):
if not self.heap or new_value < self.heap[1]:
self.heap[1] = new_value
self._bubble_up(1)
def _bubble_up(self, index):
while index > 0:
parent_index = (index - 1) // 2
if self.heap[parent_index] > self.heap[index]:
self.heap[parent_index], self.heap[index] = self.heap[index], self.heap[parent_index]
index = parent_index
else:
break
def _bubble_down(self, index):
while 2 index + 1 < len(self.heap):
min_child_index = self._find_min_child_index(index)
if self.heap[index] > self.heap[min_child_index]:
self.heap[index], self.heap[min_child_index] = self.heap[min_child_index], self.heap[index]
index = min_child_index
else:
break
def _find_min_child_index(self, index):
left_child_index = 2
index + 1
right_child_index = 2 * index + 2
if right_child_index >= len(self.heap):
return left_child_index
else:
return left_child_index if self.heap[left_child_index] < self.heap[right_child_index] else right_child_index
CopyCopy

使用示例

ph = PairingHeap()
ph.insert(5)
ph.insert(3)
ph.insert(8)
ph.insert(1)
print(ph.find_min()) # 输出 1
print(ph.delete_min()) # 输出 1
print(ph.find_min()) # 输出 3
ph.update_min(2)
print(ph.find_min()) # 输出 2
CopyCopy

这个示例中,我们创建了一个名为 PairingHeap 的类,实现了插入、删除最小值、查找最小值和更新最小值等操作。可以根据需要使用这些方法来处理配对堆。

目录
相关文章
|
存储 关系型数据库 数据库
BTree与B+Tree图文详解
B树与B+树区别
2425 0
BTree与B+Tree图文详解
|
安全 IDE 开发工具
SGX入门:如何开发第一个最简单的 SGX 应用 HelloWorld
本文将向大家展示如何基于 Intel SGX SDK 开发一个最简单 SGX 应用:HelloWorld,这个程序在可信区生产 &quot;Hello world&quot;并传递给不可信代码(缓冲区)打印输出到终端。 虽然 Intel SGX SDK 安装目录中默认提供了数个 Sample,但每个 Sample 对于初学者来说非常复杂和难以理解。 关于 SGX 开发运行环境的搭建可参考:[《SGX入门:
|
Go
Go语言浮点数完全手册 float32和float64一文掌握!
Go语言浮点数完全手册 float32和float64一文掌握!
4788 0
|
存储 运维 数据可视化
Jaeger,一个链路追踪神器!
在微服务架构中,一次请求可能经过多个服务节点,带来复杂的调用关系。如何追踪请求全链路、快速定位问题、优化性能,成为开发与运维的关键挑战。链路追踪(Tracing)技术应运而生,而 Jaeger 作为业界主流的开源分布式链路追踪系统,提供了强大的支持。本文将带你全面了解 Jaeger 的核心概念、架构原理、使用方式及实际项目中的落地方法,助你快速掌握链路追踪技术,提升系统的可观测性与稳定性。
1917 2
Jaeger,一个链路追踪神器!
|
数据挖掘 程序员 数据安全/隐私保护
解锁PDF潜力:9个Python库让你的文档处理更高效
程序员晚枫分享了Python处理PDF的9个第三方库,包括PyPDF2、pdfrw、ReportLab、pikepdf、pdfplumber、pdfminer.six、PyMuPDF、popdf和borb,各具优缺点。选择时需考虑应用场景、功能需求、库的维护状态和开源协议。例如,pdfplumber擅长内容提取,而ReportLab和PyMuPDF适用于创建和修改内容。
4140 7
|
存储 缓存 JavaScript
npm link 与 pnpm link 的用法以及不同之处
npm link 与 pnpm link 的用法以及不同之处
2141 0
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之使用Next.js建站,该选择哪个
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
自然语言处理 算法 搜索推荐
NLTK模块使用详解
NLTK(Natural Language Toolkit)是基于Python的自然语言处理工具集,提供了丰富的功能和语料库。本文详细介绍了NLTK的安装、基本功能、语料库加载、词频统计、停用词去除、分词分句、词干提取、词形还原、词性标注以及WordNet的使用方法。通过示例代码,帮助读者快速掌握NLTK的核心功能。
3540 1
|
弹性计算 人工智能 安全
大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”
2023年10月31日-11月2日,2023云栖大会在中国杭州·云栖小镇举行,阿里云弹性计算产品专家唐湘华、阿里云高级安全专家刘煜堃、蚂蚁集团高级技术专家肖俊贤三位嘉宾在【云服务器 & 计算服务】专场中共同带来题为《大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”》的主题演讲,从ECS产品安全体系及机密计算介绍、基于机密虚拟机的数据保护解决方案、蚂蚁机密PaaS最佳实践三大角度为大家做了全面的分享。
|
消息中间件 存储 缓存
一文快速掌握高性能内存队列Disruptor
`Disruptor`是LMAX公司开源的高性能内存消息队列,单线程处理能力可达600w订单/秒。本文从使用和设计角度探讨这款Java消息队列。作者sharkChili是Java开发者,CSDN博客专家,Java Guide项目维护者。文章介绍了Disruptor的基础使用,包括前置步骤、消息模型、消息处理器配置、生产者实现,并展示了效果。同时,文章详细解析了Disruptor的工作流程和高效原因,如无锁操作、分支预测和缓存填充。最后,作者提供相关资源链接并邀请读者加入交流群。
4083 0

热门文章

最新文章