• python实现二叉堆中的大顶堆(大根堆)


    堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:
    • 堆中某个节点的值总是不大于或不小于其父节点的值;
    • 堆总是一棵完全二叉树。
    将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。他们的时间复杂度如下:
    Operationfind-maxdelete-maxinsertdecrease-keymerge
    Binary
    Θ(1) Θ(log n) O(log n) O(log n) Θ(n)
               
    Fibonacci
    Θ(1) O(log n)[b] Θ(1) Θ(1)[b] Θ(1)
               
    class BigPq(object):
        def __init__(self, arr: list):
            self.arr = arr
            self.mark = 1
            while self.mark == 1:
                self.build()
    
        def build(self):
            self.mark = 0  # 先置为零, 只要经过一次swap函数,就再次置为1
            index = len(self.arr) - 1
            for i in range(index):
                if i * 2 + 2 <= index:  # 如果左右两个子节点都存在,去比较他们的大小
                    self.tri(i, i * 2 + 1, i * 2 + 2)
                elif i * 2 + 1 <= index:  # 如果只有左子节点存在,去比较他们的大小
                    if self.arr[i] < self.arr[i * 2 + 1]:
                        self.swap(i, i * 2 + 1)
                else:
                    break
    
        def tri(self, head: int, left: int, right: int):
            if self.arr[head] < self.arr[left]:
                self.swap(head, left)
            if self.arr[head] < self.arr[right]:
                self.swap(head, right)
    
        def swap(self, index_1: int, index_2: int):
            self.mark = 1
            temp = self.arr[index_2]
            self.arr[index_2] = self.arr[index_1]
            self.arr[index_1] = temp
    
        def show(self):
            print(self.arr)
    
        def pop(self) -> int:
            self.arr[0] = self.arr[-1]
            temp = self.arr.pop()
            self.mark = 1
            while self.mark == 1:
                self.build()
            return temp
    
        def push(self, value: int):
            self.arr.append(value)
            self.mark = 1
            while self.mark == 1:
                self.build()
  • 相关阅读:
    poj1904 King's Quest
    ACM竞赛须掌握的知识 以及 2个版本的POJ推荐 @ NKOJ discuss 转载的
    poj1466
    C++23中设计模式的factory模式
    poj3667 hotel
    poj1505 Copying Books
    在linux系统中安装VSCode(Visual Studio Code)
    Spring_的jar详细说明
    java开发问题总结4Maven使用问题汇总
    线程同步之信号量(sem_init,sem_post,sem_wait)
  • 原文地址:https://www.cnblogs.com/jiaxiaoxin/p/10960179.html
Copyright © 2020-2023  润新知