天天看點

Go标準庫 container包 - heap堆研究(一)

作者:程式設計牛
這篇涉及到資料結構,難度中等。

什麼是堆?

堆一般指二叉堆。是使用完全二叉樹這種資料結構建構的一種實際應用。通過它的特性,分為最大堆和最小堆兩種。

在之前,先簡單說明下什麼是完全二叉樹。

滿二叉樹和完全二叉樹

Go标準庫 container包 - heap堆研究(一)

滿二叉樹如圖所示,是完全圓滿的,不用特别解釋。

再看完全二叉樹:

Go标準庫 container包 - heap堆研究(一)

假如從根往下逐層數數,如果讀出的數連續就是完全二叉樹,否則就不是。

比如左圖,數出來的數是1,2,3,4,5,6,7,8,9,而右圖數出來的是1,2,3,4,5,6,7,8,9,11,缺了一個10。

數組存儲完全二叉樹

完全二叉樹有個神奇的規律,可以用一個一維數組存儲,比如:

Go标準庫 container包 - heap堆研究(一)

将每個節點編個号,則每個節點k的左右孩子索引分别是2*k和2*k+1,也就是說位置是固定的。

最大和最小堆

介紹了完全二叉樹,接着繼續說堆。

Go标準庫 container包 - heap堆研究(一)

最小堆定義

在二叉樹中,任何一個節點的值比其子樹的任意一個節點都要小。

最大堆定義

在二叉樹中,任何一個節點的值比其子樹的任意一個節點都要大。

堆化

在一個完全二叉樹中,将資料重新按照堆的的特性排列,就可以将完全二叉樹變成一個堆。這個過程叫做“堆化”。

總結

介紹了幾個基礎概念,下篇再繼續研究

繼續閱讀