自下而上建堆(heap)的時間復雜度證明


作者:Tobin
日期:2019/04/13
緣由:看python cookbook時,用到了heapq的庫,書中提到,如果僅僅是返回一個數組的最大值,用max就可以了,但是如果返回多個較大或者較小元素用堆,如果返回的個數接近於數組本身的元素個數時,直接用排序即可。那么我在想,為啥返回幾個元素的時候用堆效果比較好呢?於是我翻開了塵封許久的《算法導論》。

什么是堆

堆是一種數據結構。二叉堆是一個數組,近似於一個完全二叉樹。樹上的每個結點對應於數組的一個元素,除了最底層外樹是充滿的。下面的圖是一個小根堆。即父節點的值要小於子結點,大根堆要相反。

堆有哪些操作?復雜度如何證明。

建堆操作,調整操作,利用前兩個進行的堆排序操作(建完堆后,不斷將第一個元素與最后一個元素進行交換,然后調整,復雜度O(nlogn)。
主要是想記錄下復雜度的證明,具體的堆如何操作就不細講了,可以參考其它博客。
見圖。

復雜度上界是O(2n),在這之后,每次取一個最大元素並剔除后,進行調整的復雜度是O(logn),也就是說在建完堆后,每次需要到最大值得復雜度是O(logn)。顯然在返回多個較大元素的情況下,建堆進行操作的速度比遍歷要快,遍歷每次需要O(n)的時間。

堆有什么作用呢?

優先隊列的底層是用堆來實現的。


免責聲明!

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



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