數據結構:堆

概念

堆是一種圖的數據結構,被用於實現「優先隊列」。 優先隊列是一種數據結構,能夠自由添加數據,但取出數據時要從最小值開始按順序取出。在堆的樹形結構中,各個頂點被稱爲「結點(node)」,數據就存儲在這些節點中。node

堆的特色

如圖所示,每一個節點由兩個子節點,用線條鏈接即爲堆。算法

  • 結點內的數字就是存儲的數據
  • 堆中的每一個結點最多有兩個子節點
  • 樹的形狀取決於數據的個數
  • 節點的排列順序爲從上到下,同一行裏則爲從左到右
  • 堆的父節點必須小於子結點

堆的數據存儲

在堆中存儲數據時必須遵照這樣一條規則:子結點一定大於父節點數據結構

  • 頂端的結點爲根節點存儲的數據爲堆中的最小值
  • 新數據增長時會被放在堆的最底部靠左的位置
  • 堆的底部沒有多餘空間時,會另起一行把數據加在這一行的最左端

例如,將數字5添加到堆中3d

  • 結點6有個空位置,將數字5加在結點6中
  • 數字5結點的父結點大於自己,故調換位置
  • 交換完畢後數字5結點的父節點小於自己,因此再也不交換,往堆中插入數據5的操做結束

堆的數據獲取

從堆中獲取數據時,須要從最上面的數據開始取,取完數據後,堆須要進行從新排序,將最後的數據移到取出的結點位置。cdn

如圖所示,取出堆中的數字1。 blog

  • 1被取出後,結構須要從新調整
  • 將最後的數字6結點移到最頂部
  • 若是子結點的數字小於父節點,就將父節點與其左右兩個子節點中較小的一個進行交換
  • 數字6結點的子結點3和5,3爲較小者。故與3進行位置調換
  • 交換後,數字6結點的兩個子節點4和8,4爲較小者。故與4進行位置交換
  • 交換後,數字6結點無子節點。故交換完畢,從堆中取出數據的操做完成

寫在最後

  • 文中使用的圖片源自《個人第一本算法書》,如若侵權,請評論區留言,做者當即刪除相關圖片。
  • 文中若有錯誤,歡迎在評論區指正,若是這篇文章幫到了你,歡迎點贊和關注😊
  • 本文首發於掘金,未經許可禁止轉載💌
相關文章
相關標籤/搜索