zoukankan      html  css  js  c++  java
  • 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()
  • 相关阅读:
    November 07th, 2017 Week 45th Tuesday
    November 06th, 2017 Week 45th Monday
    November 05th, 2017 Week 45th Sunday
    November 04th, 2017 Week 44th Saturday
    November 03rd, 2017 Week 44th Friday
    Asp.net core 学习笔记 ( Area and Feature folder structure 文件结构 )
    图片方向 image orientation Exif
    Asp.net core 学习笔记 ( Router 路由 )
    Asp.net core 学习笔记 ( Configuration 配置 )
    qrcode render 二维码扫描读取
  • 原文地址:https://www.cnblogs.com/jiaxiaoxin/p/10960179.html
Copyright © 2011-2022 走看看