数据结构六——堆的应用
文章出處:極客時間《數據結構和算法之美》-作者:王爭。該系列文章是本人的學習筆記。
堆比較適合動態數據的場景。
1 應用一:優先級隊列
一個優先級隊列就是一個堆。
1.1 合并小文件
假設我們有100個小文件。每個文件中的字符串按照從小到大排序好了?,F在需要把這100個小文件合并為1個大文件,并且還要按照字符串從小到大排序。
這和歸并排序算法的合并操作有點類似。我們從每個文件讀取一條數據,形成一個長度為100的數組。然后排序數組,將最小的文本寫入最終合并的文件中,并且從最小文本所在的文件讀取一條數據,再次形成長度100的數組。這里有個排序操作,按照快排的時間復雜度O(nlogn)。我們可以對這一步做改進。
使用最小堆來存放這100條數據。在堆頂的元素就是最小元素。
1 我們從100個小文件分別讀一條數據,插入最小堆。
2 刪除堆頂元素,寫入最終合并的文件中。
3 從從最小文本所在的文件讀取一條數據,插入最小堆。重復步驟2。
插入數據、刪除數據的時間復雜度都是O(logn),比原來的排序優化了。
1.2 高性能定時器
對于定時器一般的做法是,每個一秒(一定時間)檢查任務隊列的中的任務是不是到了執行時間。到了,就執行。
優化的做法是:按照定時器的開始執行時間,建一個最小堆。在堆頂任務開始執行之前都不需要檢查其他任務。
2 應用二:求Top k
求top k可以分為兩種場景。一種是靜態場景,數據不會發生變化,另一類是動態場景,數據在實時變化。
靜態場景下的解決方法是排序數組,然后返回前k個元素。
動態場景下如果每次都排序,時間復雜度高。我們建一個容量為k的最小堆。當遇到比堆頂元素大的數據,則刪除堆頂元素,插入新數據。這樣在某個時刻堆中的所有元素就是top k 元素。
3 應用三:求中位數
中位數:如果數組長度n是奇數,下標等于n2\dfrac{n}{2}2n?的元素是中位數。如果n是偶數,則下標等于n2?1\dfrac{n}{2}-12n??1和n2\dfrac{n}{2}2n?兩個元素都是中位數,我們可以取下標n2\dfrac{n}{2}2n?的元素。
我們可以利用兩個堆:一個最大堆,一個最小堆。最大堆中所有的元素都小于最小堆。我們將數組中的前n2\dfrac{n}{2}2n?個元素放入最大堆,后面的元素放入最小堆。這樣最大堆的堆頂就是中位數。
總結
以上是生活随笔為你收集整理的数据结构六——堆的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 Android 和 iOS 流畅度
- 下一篇: nginx的502错误及常见解决方法汇总