【算法與數據結構】二叉堆和優先隊列 Priority Queue

優先隊列的特色

普通隊列遵照先進先出(FIFO)的規則,而優先隊列雖然也叫隊列,規則有所不一樣:web

  • 最大優先隊列:優先級最高的元素先出隊
  • 最小優先隊列:優先級最低的元素先出隊

優先隊列能夠用下面幾種數據結構來實現:數組

  • 基於堆 heap,包括下面幾種堆:
    • 二叉堆
    • 多項式堆
    • Fibonacci 堆
  • 基於二叉搜索樹 BST

若是用線性數據結構來實現優先級隊列,則時間複雜度均爲 O(n)。而若是用二叉堆來實現,時間複雜度能夠提升到 O(logn)。下面以二叉堆爲例。數據結構

實現二叉堆

二叉堆有兩個限制:svg

  • 二叉堆必須是徹底二叉樹(元素從上而下,自左至右排列)
  • 二叉堆中任一父結點的值大於其左右兩子節點的值(大頂堆,能夠實現最大優先隊列),或小於其左右兩子節點的值(小頂堆,能夠實現最小優先隊列)

根據二叉堆上面的性質,能夠用一個數組來保存二叉堆中的結點。其中,對於數組中任一個秩爲 x 的元素,其對應二叉樹中,父子結點的秩分別爲:.net

  • 父結點:r = (x - 1) /2
  • 左子結點:r = 2x +1
  • 右子結點:r = 2x + 2

二叉堆的構建,能夠參考 這裏xml

相關文章
相關標籤/搜索