日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构六——堆的应用

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构六——堆的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章出處:極客時間《數據結構和算法之美》-作者:王爭。該系列文章是本人的學習筆記。
堆比較適合動態數據的場景。

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??1n2\dfrac{n}{2}2n?兩個元素都是中位數,我們可以取下標n2\dfrac{n}{2}2n?的元素。
我們可以利用兩個堆:一個最大堆,一個最小堆。最大堆中所有的元素都小于最小堆。我們將數組中的前n2\dfrac{n}{2}2n?個元素放入最大堆,后面的元素放入最小堆。這樣最大堆的堆頂就是中位數。

總結

以上是生活随笔為你收集整理的数据结构六——堆的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。