Timer中二叉堆算法實現

首先說說數據結構概念——堆(Heap),其實也沒什麼大不了,簡單地說就是一種有序隊列而已,普通的隊列是先入先出,而二叉堆是:最小先出。 數組

這不是很簡單麼?若是這個隊列是用數組實現的話那用打擂臺的方式從頭至尾找一遍,把最小的拿出來不就好了?行啊,但是出隊的操做是很頻繁的,而每次都得打一遍擂臺,那就低效了,打擂臺的時間複雜度爲Ο(n),那如何不用從頭至尾fetch一遍就出隊呢?二叉堆能比較好地解決這個問題,不過以前先介紹一些概念。 數據結構

徹底樹(Complete Tree):從下圖中看出,在第n層深度被填滿以前,不會開始填第n+1層深度,還有必定是從左往右填滿。
fetch

再來一棵徹底三叉樹:
spa

這樣有什麼好處呢?好處就是能方便地把指針省略掉,用一個簡單的數組來表示一棵樹,如圖:
指針

那麼下面介紹二叉堆:二叉堆是一種徹底二叉樹,其任意子樹的左右節點(若是有的話)的鍵值必定比根節點大,上圖其實就是一個二叉堆。 隊列

你必定發覺了,最小的一個元素就是數組第一個元素,那麼二叉堆這種有序隊列如何入隊呢?看圖:
二叉樹

假設要在這個二叉堆裏入隊一個單元,鍵值爲2,那隻需在數組末尾加入這個元素,而後儘量把這個元素往上挪,直到挪不動,通過了這種複雜度爲Ο(logn)的操做,二叉堆仍是二叉堆。 方法

那如何出隊呢?也不難,看圖: im

出隊必定是出數組的第一個元素,這麼來第一個元素之前的位置就成了空位,把最後一個元素放到第一個位置再調整成正常狀態就能夠了。 數據

還有另外一種調整的方法

出隊必定是出數組的第一個元素,這麼來第一個元素之前的位置就成了空位,咱們須要把這個空位挪至葉子節點,而後把數組最後一個元素插入這個空位,把這個「空位」儘可能往上挪。

相關文章
相關標籤/搜索