堆:完全二叉樹,高度為o(lgn),基本操作至多和樹的高度成正比,
構建堆的時間複雜度是o(n),
堆是一顆完全二叉樹,假設有n個節點,樹高h=log2(n).證明方法如下:
1 )假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2^x,x 從0 到h。
2 )構建堆的過程是自下而上,對於每層非葉子節點需要調整的次數為h-x,因此很明顯根節點需要調整(h-0) 次,每一層節點需要調整(h-1) 次,最下層非葉子節點需要調整1次。
3 )因此可知:構造樹高為h 的二叉樹精確時間複雜度為:
s=1*2^(h-1)+2*2^(h-2)+....+h*2^0
可以看出以上公式是等差數列和等比數列乘積之和,可以通過錯位相減求。
可以得到s=2*2^h-2-h
將h=log2(n)代入的s=2n-2-log2(n),近似的時間複雜度就是o(n).
4) 堆找出第k大元素的複雜度是o(n).
2 堆排序
過程: (1) 建立堆 (2) 得到堆頂元素為最大元素(3) 去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序,(4) 堆頂元素為第二大元素(5) 重複步驟3,直到堆變空。
ref:
3 topk 問題( 堆應用)
現有n 個數,設計演算法得到前k 大的數(k常用語實現**熱搜榜
解決思路: (1) 排序後切片:o(nlogn)
(2) 排序lowb 三人組:o(kn)
(3) 堆排序的思路:o(nlogk)
取列表前k個元素建立乙個小根堆,堆頂就是目前第k 大的數/ 小的數
依次向後遍歷原列表,對於列表中的元素,如果小於堆頂,則忽略該元素,如果大於堆頂,則將堆頂更換為該元素,並且對堆進行依次調整。遍歷列表所有元素後,倒序彈出堆頂。
資料結構與演算法 堆結構
1 本質 一顆特殊的樹。2 特性 3 分類 對於每乙個節點的值都大於等於子節點的值的情況,該堆被稱為大頂堆。對於每乙個節點的值都小於等於子節點的值的情況,該堆被稱為小頂堆。4 儲存方式 對於完全二叉樹而言,陣列儲存方式是最節省記憶體的。5 插入節點的時間複雜度 將節點插入到靠左的底層作為新的葉子節點...
資料結構與演算法 堆
在 演算法設計技巧與分析 這本書的第四章,介紹了堆。於是按照上面的偽 實現了一下。資料結構定義maxheap.hpp如下,1 ifndef max heap hpp 2 define max heap hpp 34 include 5using std vector 67 class maxheap...
資料結構與演算法 堆
堆的乙個經典的實現是完全二叉樹 complete binary tree 這樣實現的堆稱為二叉堆 binary heap 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...