博客
关于我
用最大堆实现最大优先队列(Python)
阅读量:387 次
发布时间:2019-03-05

本文共 2567 字,大约阅读时间需要 8 分钟。

优先队列的实现:基于最大堆的Python代码示例

优先队列是一种常见的数据结构,常用于需要根据一定优先级进行排序的操作。在本文中,我们将基于最大堆的实现方式来介绍优先队列的实现方法。

优先队列的结构

优先队列的存储结构通常采用数组形式。为了方便实现,数组的长度会根据需要进行动态扩容。每个元素的位置决定了其在队列中的优先级。当元素数量超过数组长度时,需要对数组进行扩容,以确保有足够的空间存储新元素。

优先队列的实现步骤

优先队列的实现主要包括以下几个步骤:

  • 初始化:创建一个空的数组用于存储队列元素,初始大小设为0。
  • 入队操作:将元素添加到数组的末尾,并调用up_adjust方法进行上调整,确保最大堆的性质。
  • 出队操作:删除队列头元素,并调用down_adjust方法进行下调整,以恢复最大堆的结构。
  • 上调整(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/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 实战 | 基于YoloV5和Mask RCNN实现汽车表面划痕检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 实战 | 文本图片去水印--同时保持文本原始色彩(附源码)
    查看>>
    OpenCV与AI深度学习 | 实战—使用YOLOv8图像分割实现路面坑洞检测(步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战篇——基于YOLOv8和OpenCV实现车速检测(详细步骤 + 代码)
    查看>>
    OpenCV与AI深度学习 | 实战|OpenCV实时弯道检测(详细步骤+源码)
    查看>>
    OpenCV与AI深度学习 | 实践教程|旋转目标检测模型-TensorRT 部署(C++)
    查看>>
    OpenCV与AI深度学习 | 工业缺陷检测中数据标注需要注意的几个事项
    查看>>
    OpenCV与AI深度学习 | 干货 | 深度学习模型训练和部署的基本步骤
    查看>>
    OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)
    查看>>
    OpenCV与AI深度学习 | 深度学习检测小目标常用方法
    查看>>
    OpenCV与AI深度学习 | 超越YOLOv10/11、RT-DETRv2/3!中科大D-FINE重新定义边界框回归任务
    查看>>
    OpenCV与AI深度学习 | 高效开源的OCR工具:Surya-OCR介绍与使用
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    OpenCV中的监督学习
    查看>>
    opencv中读写视频
    查看>>
    opencv之cv2.findContours和drawContours(python)
    查看>>
    opencv之namedWindow,imshow出现两个窗口
    查看>>