作者:Tobin
日期:2019/04/13
緣由:看python cookbook時,用到了heapq的庫,書中提到,如果僅僅是返回一個數組的最大值,用max就可以了,但是如果返回多個較大或者較小元素用堆,如果返回的個數接近於數組本身的元素個數時,直接用排序即可。那么我在想,為啥返回幾個元素的時候用堆效果比較好呢?於是我翻開了塵封許久的《算法導論》。
什么是堆
堆是一種數據結構。二叉堆是一個數組,近似於一個完全二叉樹。樹上的每個結點對應於數組的一個元素,除了最底層外樹是充滿的。下面的圖是一個小根堆。即父節點的值要小於子結點,大根堆要相反。
堆有哪些操作?復雜度如何證明。
建堆操作,調整操作,利用前兩個進行的堆排序操作(建完堆后,不斷將第一個元素與最后一個元素進行交換,然后調整,復雜度O(nlogn)。
主要是想記錄下復雜度的證明,具體的堆如何操作就不細講了,可以參考其它博客。
見圖。
復雜度上界是O(2n),在這之后,每次取一個最大元素並剔除后,進行調整的復雜度是O(logn),也就是說在建完堆后,每次需要到最大值得復雜度是O(logn)。顯然在返回多個較大元素的情況下,建堆進行操作的速度比遍歷要快,遍歷每次需要O(n)的時間。
堆有什么作用呢?
優先隊列的底層是用堆來實現的。