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()

 

posted @ 2019-06-01 16:56  辣眼睛De小新  阅读(2228)  评论(0编辑  收藏  举报