(3)其他應(yīng)用
可使用堆解決下列問題:
<>1.構(gòu)建哈夫曼代碼:
我們知道在構(gòu)建哈夫曼樹時,每次要選擇集合中兩個最小的元素,然后將元素值相加,合并為一個新節(jié)點,此時兩個最小的元素的取出可以用HeapExtractMin函數(shù)來實現(xiàn),產(chǎn)出的新節(jié)點需要插入到堆中,我們有MinHeapInsert函數(shù)來實現(xiàn)。
<>2.計算大型浮點數(shù)集合的和:
我們知道大浮點數(shù)和小浮點數(shù)相加,很可能會造成精度誤差。所以可以每次從優(yōu)先級隊列中取出最小的兩個數(shù)相加,和1的實現(xiàn)差不多。
<>3.將多個小型有序文件合并到一個大型有序文件中:
假設(shè)有 n個小型有序文件,建立一個大小為n的最小堆,每個有序文件貢獻一個(如果有的話),每次取出最小值插入到大型文件中,并且去掉該最小元素,并將它在文件中的后續(xù)元素插入到堆中,能夠在o(lgn)的時間內(nèi)從n個文件中選擇要插入到大型文件中的元素。
<>4.在具有10億個數(shù)值的集合中找到100萬個最大的數(shù):
建立100萬個元素的最小二叉堆,后面的數(shù)和根部進行比較,如果大于根部,進行堆調(diào)整。
1.n×m遍掃描
【算法基本描述】n×m遍掃描
【算法復(fù)雜度】O(nm)
【算法思想】每次都掃描一遍數(shù)組,取出最大元素,這樣掃描m遍就能得到m個最大的數(shù)。
2.排序后取最大m個數(shù)
【算法基本描述】對n個數(shù)排序,對拍完序后的序列取m個最大的數(shù)
【算法復(fù)雜度】視排序的復(fù)雜度,一般為O(nlogn)或O(n^2)
3.最小堆
【算法基本描述】一遍掃描+最小堆
【算法復(fù)雜度】O(nlogm) 遍歷O(n) 最小堆O(logm)
【算法偽代碼】
建立一個最小堆(優(yōu)先隊列),最小堆的大小控制在m之內(nèi);
for 每個數(shù):
if 這個數(shù)比最小堆的堆頂元素大:
彈出最小堆的最小元素,
*把這個數(shù)插入到最小堆;
最小堆中的m個元素就是所要求的元素;
中最小堆的作用就是保持里面始終有m個最大元素,且m個元素中最小的元素在堆頂。
【其他】如果要求n個數(shù)中取最小的m個,只要大頂堆即可
總結(jié):當n與m差不多大時,采用復(fù)雜度較低的排序是比較可取的,因為簡單。當m< 我不敢說我的算法是最好的,但是它一定是一個復(fù)雜度較低的算法。 使用用最小堆來找最大的K個數(shù)源碼:
北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |