配对堆(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

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

目录
相关文章
堆的介绍与堆的实现和调整
堆的介绍与堆的实现和调整
81 0
|
5月前
|
存储 Java 对象存储
Java虚拟机(JVM)中的栈(Stack)和堆(Heap)
在Java虚拟机(JVM)中,栈(Stack)和堆(Heap)是存储数据的两个关键区域。它们在内存管理中扮演着非常重要的角色,但各自的用途和特点有所不同。
54 0
|
6月前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
41 0
|
存储 算法 Java
JVM系列(3):堆(Heap)
Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。
79 0
|
7月前
|
存储 Java 程序员
堆栈与堆(Stack vs Heap)有什么区别?
堆栈与堆(Stack vs Heap)有什么区别?
84 0
|
Python
区间堆(Interval Heap)
区间堆(Interval Heap)是一种基于线段树的数据结构,它可以高效地支持区间查询和修改操作。区间堆的主要应用场景是处理与时间相关的问题,例如区间计数、区间求和等。
151 2
|
Python
配对堆(Pairing Heap
配对堆(Pairing Heap)是一种基于二叉堆的可并堆数据结构,它的主要特点是每个节点都有两个子节点,分别称为左子节点和右子节点。配对堆支持插入、查询最小值、合并和修改元素等操作。它具有速度快和结构简单的优势,但由于其为基于势能分析的均摊复杂度,无法可持久化。
133 0
|
调度 Python
区间堆(Interval Heap
区间堆(Interval Heap)是一种优先队列的数据结构,主要用于解决区间相关的问题,如区间调度、区间覆盖等。它可以在 O(log n) 的时间复杂度内完成插入、删除、查询操作。区间堆有两种主要实现方式:线段树和二叉堆。线段树将整个区间分为多个小区间,每个小区间维护一个子堆;二叉堆则使用一颗完全二叉树表示区间堆。
95 0
|
算法
每天一点算法-堆(Day9)
每天一点算法-堆(Day9)
61 0
|
存储 缓存 算法
堆(heap)和栈(stack)的区别
堆(heap)和栈(stack)的区别
240 0
堆(heap)和栈(stack)的区别