本文共 2567 字,大约阅读时间需要 8 分钟。
优先队列的实现:基于最大堆的Python代码示例
优先队列是一种常见的数据结构,常用于需要根据一定优先级进行排序的操作。在本文中,我们将基于最大堆的实现方式来介绍优先队列的实现方法。
优先队列的存储结构通常采用数组形式。为了方便实现,数组的长度会根据需要进行动态扩容。每个元素的位置决定了其在队列中的优先级。当元素数量超过数组长度时,需要对数组进行扩容,以确保有足够的空间存储新元素。
优先队列的实现主要包括以下几个步骤:
up_adjust
方法进行上调整,确保最大堆的性质。down_adjust
方法进行下调整,以恢复最大堆的结构。以下是优先队列的Python代码实现:
class PriorityQueue: def __init__(self): self.array = [] self.size = 0 def enqueue(self, element): self.array.append(element) self.size += 1 self.up_adjust() def dequeue(self): if self.size <= 0: raise Exception('队列为空') head = self.array[0] self.array[0] = self.array[self.size - 1] self.array.pop(0) self.size -= 1 self.down_adjust() return head def up_adjust(self): child_index = self.size - 1 parent_index = (child_index - 1) // 2 temp = self.array[child_index] while child_index > 0 and temp > self.array[parent_index]: self.array[child_index] = self.array[parent_index] child_index = parent_index parent_index = (child_index - 1) // 2 self.array[child_index] = temp def down_adjust(self): parent_index = 0 temp = self.array[parent_index] child_index = 1 while child_index < self.size and self.array[child_index] <= self.array[child_index + 1]: temp = self.array[child_index] child_index += 1 self.array[parent_index] = temp parent_index = child_index child_index = 2 * parent_index + 1 def printList(self): print(self.array)# 创建优先队列实例queue = PriorityQueue()# 添加元素queue.enqueue(3)queue.enqueue(6)queue.enqueue(2)queue.enqueue(8)queue.enqueue(4)# 打印当前队列状态print("当前队列状态:")queue.printList()# 出队操作print("\n开始出队操作:")result = queue.dequeue()print(f"出队元素:{result}")queue.printList()# 再次出队print("\n再次出队操作:")result = queue.dequeue()print(f"出队元素:{result}")queue.printList()# 添加新元素queue.enqueue(1)queue.printList()# 最终出队print("\n最后出队操作:")result = queue.dequeue()print(f"出队元素:{result}")queue.printList()
PriorityQueue
的类,用于实现优先队列。__init__
方法初始化数组和大小,初始为空。enqueue
方法将元素添加到数组末尾,并调用up_adjust
进行上调整。dequeue
方法删除队列头元素,并调用down_adjust
进行下调整。up_adjust
方法从叶子节点开始,逐步向上调整最大堆的性质。down_adjust
方法从根节点开始,逐步向下调整最大堆的性质。printList
方法打印当前队列状态。通过上述代码实现,可以清晰地看到优先队列的存储结构和操作流程。在实际应用中,可以通过自定义类扩展优先队列的功能,满足不同的需求。
转载地址:http://ubvg.baihongyu.com/