配对堆(Pairing heap

简介: 配对堆(Pairing heap)是一种优先队列的数据结构,它的主要特点是每个节点可以有一个优先级,元素的优先级可以是任意的,可以是整数、浮点数或其他类型。配对堆支持插入、删除最小元素(即弹出最小元素)、查找最小元素以及调整优先级等操作。它具有堆的性质,即任意节点的优先级大于等于(或小于等于)其子节点优先级。

配对堆(Pairing heap)是一种优先队列的数据结构,它的主要特点是每个节点可以有一个优先级,元素的优先级可以是任意的,可以是整数、浮点数或其他类型。配对堆支持插入、删除最小元素(即弹出最小元素)、查找最小元素以及调整优先级等操作。它具有堆的性质,即任意节点的优先级大于等于(或小于等于)其子节点优先级。
使用配对堆时,首先需要创建一个配对堆,然后可以通过插入、删除最小元素和调整优先级等操作来维护堆。
以下是一个简单的使用 Python 实现的配对堆示例:

class PairingHeap:
def init(self):
self.heap = []
def insert(self, item, priority):
node = (priority, item)
self.heap.append(node)
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_node = self.heap[1]
self.heap[1] = self.heap.pop()
self._bubble_down(1)
return min_node
def find_min(self):
if not self.heap:
return None
return self.heap[1]
def adjust_priority(self, item, new_priority):
for i, node in enumerate(self.heap):
if node[1] == item:
self.heap[i] = (new_priority, item)
break
self._bubble_up(i)
self._bubble_down(i)
def _bubble_up(self, index):
while index > 0:
parent_index = (index - 1) // 2
parent = self.heap[parent_index]
if self.heap[index][0] < parent[0]:
break
self.heap[index], self.heap[parent_index] = parent, self.heap[index]
index = parent_index
def _bubble_down(self, index):
while 2 index + 1 < len(self.heap):
min_child_index = self._min_child_index(index)
if self.heap[index][0] < self.heap[min_child_index][0]:
break
self.heap[index], self.heap[min_child_index] = self.heap[min_child_index], self.heap[index]
index = min_child_index
def _min_child_index(self, index):
left = 2
index + 1
right = 2 * index + 2
if right >= len(self.heap):
return left
if self.heap[left][0] < self.heap[right][0]:
return left
return right

使用示例

ph = PairingHeap()
ph.insert("task1", 1)
ph.insert("task2", 3)
ph.insert("task3", 2)
print(ph.find_min()) # 输出 task1
ph.delete_min()
print(ph.find_min()) # 输出 task2
ph.adjust_priority("task2", 0)
print(ph.find_min()) # 输出 task2
CopyCopy

在实际应用中,配对堆可以用于实现一些任务调度系统、资源调度系统等,优先处理优先级较高的任务或资源。
推荐的一个实际应用场景是:实现一个任务管理系统,其中任务可以有优先级,系统需要按照优先级顺序执行任务。在这种情况下,可以使用配对堆来存储任务及其优先级,然后通过删除最小元素(即弹出优先级最高的任务)来按优先级执行任务。

目录
相关文章
|
缓存 IDE 安全
基准测试神器JMH —— 详解36个官方例子
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。而JMH是一个用来构建,运行,分析Java或其他运行在JVM之上的语言的 纳秒/微秒/毫秒/宏观 级别基准测试的工具。
2353 1
基准测试神器JMH —— 详解36个官方例子
|
Java Docker 容器
|
编译器 程序员 C语言
精简函数栈帧:优化创建和销毁过程的完全解析(建议收藏,提升内功)
精简函数栈帧:优化创建和销毁过程的完全解析(建议收藏,提升内功)
234 1
|
JSON Dart Android开发
Flutter 2024: Impeller引擎引领渲染新纪元
Flutter 2024以Impeller引擎引领渲染新时代,全面提升性能与流畅度。Impeller已在iOS及Android(支持Vulkan/OpenGL)全面部署,Material 3集成深化视觉体验,多视图支持增强复杂UI管理。Dart 3.2与3.4版本迭代优化语言特性与性能,引入宏编程简化JSON处理。桌面与Web端持续优化,深化平台适配。
577 14
|
机器学习/深度学习 数据可视化 算法
图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取
本文详细介绍了如何利用NetworkX库从图结构中提取重要特征。首先,通过定义辅助函数设置了图的可视化选项,并以Zachary网络数据集为例进行了可视化展示。接着,文章深入探讨了三类图特征:基于节点的特征(如节点度、中心性等)、基于边的特征(如最短路径、邻域重叠等)以及基于图的特征(如Graphlets、Weisfeiler-Leman特征等)。通过这些特征的提取与分析,可以全面理解网络结构,识别关键节点,分析信息流动模式,并发现潜在的隐藏模式。本文不仅展示了如何应用这些特征来揭示社交网络中的角色和联系,还强调了其在交通网络分析和生物系统研究等领域的广泛应用潜力。
579 12
图特征工程实践指南:从节点中心性到全局拓扑的多尺度特征提取
|
存储 数据库 索引
B树和B+树的插入、删除图文详解
B树和B+树的插入、删除图文详解
490 0
|
Windows Python
每日自动发邮件(Python +QQ邮箱 + Windows 10定时任务)
每日自动发邮件(Python +QQ邮箱 + Windows 10定时任务)
205 0
每日自动发邮件(Python +QQ邮箱 + Windows 10定时任务)
|
机器学习/深度学习 人工智能 自然语言处理
AI大模型的核心成功因素通常可以归结为三大要素:大数据、大算力和强算法。
AI大模型的核心成功因素通常可以归结为三大要素:大数据、大算力和强算法。
2535 0
|
机器学习/深度学习 搜索推荐 数据库
矢量数据库的未来发展趋势:新技术与应用展望
【4月更文挑战第30天】随着AI和机器学习的发展,矢量数据库在处理非结构化数据方面的重要性日益增强。预测到2028年,全球矢量数据库市场将从2023年的15亿美元增长至43亿美元。未来趋势包括:并行计算与分布式架构提升处理能力,硬件加速技术(如TPU和昇腾芯片)提高性能,自适应索引机制优化查询效率。应用领域将拓展至NLP、图像视频分析和推荐系统,为各行业带来更多创新和价值。
|
Web App开发 数据可视化
ElasticSearch使用谷歌插件安装可视化
ElasticSearch使用谷歌插件安装可视化
421 0