当前位置: 首页 > news >正文

数据结构:python实现最大堆算法

概念

最大堆是一种完全二叉树,父节点的值总是大于或等于其子节点的值。通常,最大堆可以用数组来实现。

最大堆的主要操作包括插入元素和提取最大值。在Python中,可以用一个列表来存储堆的元素。索引从0开始的话,父节点和子节点的位置关系需要确定。对于索引i的节点,其左子节点是2i+1,右子节点是2i+2,父节点则是(i-1)//2。

插入元素时,需要将新元素添加到数组的末尾,然后进行上浮操作(percolate up),也就是不断和父节点比较,如果比父节点大就交换位置,直到满足最大堆的性质。这样保证插入后堆仍然正确。

提取最大值的操作通常是取出堆顶元素(即数组的第一个元素),然后将数组的最后一个元素移到堆顶,接着进行下沉操作(percolate down),也就是与左右子节点中较大的那个比较,如果比子节点小就交换,直到满足堆的性质。

编写代码的大致步骤:
1.定义MaxHeap类,初始化时可能有输入的数组,并构建堆。
2.实现插入方法,把元素添加到列表末尾,然后上浮。
3.实现提取最大值的方法,交换首尾元素,弹出最后一个,然后下沉新的首元素。
4.编写上浮和下沉的辅助方法。
5.编写构建堆的方法,比如使用下沉操作从最后一个非叶子节点开始调整。

以下是使用Python实现的最大堆(Max Heap)算法:

class MaxHeap:
    def __init__(self, arr=None):
        self.heap = []
        if arr is not None:
            self.heap = arr.copy()
            self._build_heap()

    def _parent(self, i):
        return (i - 1) // 2

    def _left_child(self, i):
        return 2 * i + 1

    def _right_child(self, i):
        return 2 * i + 2

    def _swap(self, i, j):
        self.heap[i], self.heap[j] = self.heap[j], self.heap[i]

    def _heapify_up(self, i):
        while i > 0 and self.heap[i] > self.heap[self._parent(i)]:
            parent = self._parent(i)
            self._swap(i, parent)
            i = parent

    def _heapify_down(self, i):
        max_index = i
        n = len(self.heap)
        
        while True:
            left = self._left_child(i)
            right = self._right_child(i)
            
            if left < n and self.heap[left] > self.heap[max_index]:
                max_index = left
            if right < n and self.heap[right] > self.heap[max_index]:
                max_index = right
                
            if max_index != i:
                self._swap(i, max_index)
                i = max_index
            else:
                break

    def _build_heap(self):
        n = len(self.heap)
        start = n // 2 - 1  # 最后一个非叶子节点
        for i in range(start, -1, -1):
            self._heapify_down(i)

    def insert(self, value):
        self.heap.append(value)
        self._heapify_up(len(self.heap) - 1)

    def extract_max(self):
        if not self.heap:
            return None
        max_val = self.heap[0]
        last = self.heap.pop()
        if self.heap:
            self.heap[0] = last
            self._heapify_down(0)
        return max_val

    def get_max(self):
        return self.heap[0] if self.heap else None

    def size(self):
        return len(self.heap)

    def is_empty(self):
        return len(self.heap) == 0

# 示例用法
if __name__ == "__main__":
    # 测试插入和提取操作
    heap = MaxHeap()
    heap.insert(3)
    heap.insert(1)
    heap.insert(4)
    heap.insert(9)
    heap.insert(2)
    
    print("Extracting max values:")
    while not heap.is_empty():
        print(heap.extract_max(), end=" ")  # 应该输出:9 4 3 2 1
    
    # 测试通过数组初始化
    print("\n\nTesting array initialization:")
    arr = [3, 1, 4, 9, 2]
    heap_from_array = MaxHeap(arr)
    print("Original array:", arr)
    print("Heap structure:", heap_from_array.heap)
    print("Extracting max values:")
    while not heap_from_array.is_empty():
        print(heap_from_array.extract_max(), end=" ")  # 应该输出:9 4 3 2 1

相关文章:

  • 联核科技AGV无人叉车的应用场景有哪些?
  • 3D数字化:家居行业转型升级的关键驱动力
  • 【电赛推荐芯片】差分放大器:INA143,仪表放大器:INA128 INA333 PGA204
  • 在WSL2-Ubuntu中安装CUDA12.8、cuDNN、Anaconda、Pytorch并验证安装
  • thrift软件、.thrif文件和thrift协议是什么关系,有什么用
  • TensorFlow.js 全面解析:在浏览器中构建机器学习应用
  • 无人机扩频技术对比!
  • 美团校招实习笔试历年真题与内推
  • Facebook 隐私保护技术的发展与未来趋势
  • 记录片《遇见大连》
  • 计算机毕业设计SpringBoot+Vue.js爱心捐赠项目推荐系统 慈善大数据(源码+文档+PPT+讲解)
  • 自然语言处理:高斯混合模型
  • AI编程工具-(六)
  • 【RAG 篇】万字长文:向量数据库选型指南 —— Milvus 与 FAISS/Pinecone/Weaviate 等工具深度对比
  • Linux系统增加用户用于深度学习
  • java错题总结
  • 小程序事件系统 —— 32 事件系统 - 事件分类以及阻止事件冒泡
  • 智能机器人学习机WT3000A AI芯片方案-自然语音交互 打造沉浸式学习体验
  • licheepi nano usb RNDIS连接外网方法及使用
  • 三维建模与视频融合(3D-Video Integration)技术初探。
  • 雄安免费网站建设方案/北京网站推广公司
  • 做教育网站多少钱/seo营销策略
  • 怎么快速提高网站权重/seo网络优化招聘
  • 怎么在360网站做词条/crm软件
  • 乌鲁木齐做网站哪家好/百度搜索指数是怎么计算的
  • 电子商务网站建设源码/什么是网络销售