python實現二叉堆中的大頂堆(大根堆)


堆(英語:heap)是計算機科學中一類特殊的數據結構的統稱。堆通常是一個可以被看做一棵樹的數組對象。堆總是滿足下列性質:
  • 堆中某個節點的值總是不大於或不小於其父節點的值;
  • 堆總是一棵完全二叉樹。
將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。他們的時間復雜度如下:
Operation find-max delete-max insert decrease-key merge
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()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM