精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

什么是堆?有哪些使用場景?

開發 前端
我們在前面二叉樹的學習中就知道,完全二叉樹最理想的存儲方式便是數組,省去了左右節點的指針空間,而且不會造成很大的浪費。比如,節點位置為i,那么其左子樹就存放在2i的位置,右子樹就存放在2i+1的位置,其父節點在i/2的位置,向上向下索引都很快捷。

一、什么是堆

1.1 堆的定義

堆是一個完全二叉樹;

堆中的每一個節點的值都必須大于等于(大頂堆)or小于等于(小頂堆)其子樹中的每個節點的值;

1.2 堆上的操作

  • 堆的存儲
  • 我們在前面二叉樹的學習中就知道,完全二叉樹最理想的存儲方式便是數組,省去了左右節點的指針空間,而且不會造成很大的浪費。比如,節點位置為i,那么其左子樹就存放在2i的位置,右子樹就存放在2i+1的位置,其父節點在i/2的位置,向上向下索引都很快捷。
  • 插入元素
  • 我們一般都將待插入的數據作為一個節點放到當前堆的最后面,然后自下而上進行堆化操作。

在堆的最后面插入一個節點

自下而上進行堆化

  • 刪除堆頂元素
  • 堆一般都是進行刪除堆頂元素,因為堆頂不是最大值就是最小值。一般不會刪除非堆頂元素,這是堆這種數據結構的特性決定的。
  • 我們先將堆中的最后一個元素賦值給堆頂元素,然后再刪除最后一個元素,最后再進行自上而下的堆化操作。

刪除堆頂元素的堆化操作

在如上插入和刪除堆頂元素的操作中,主要的時間消耗都在堆化這個過程中,堆化操作需要比較和交換的次數最大不會超過樹的高度,而前面我們說過,完全二叉樹的高度是2的對數,因此插入和刪除堆頂元素操作的時間復雜度是O(logn)。

二、 堆排序

給定一個數組,其中的元素都是無序雜亂的,我們怎么對它進行堆排序呢?

2.1 建堆

首先,我們需要將該數組建立為一個大頂堆(小頂堆),通常有以下兩種建堆的方法:

  • 自上而下
  • 把下標為1的元素作為原始堆,然后從下標2開始直到n,依次插入前面的堆中,就像前面講的插入元素操作一樣,不斷地進行堆化,然后形成一個大頂堆;其時間復雜度為O(nlogn),不夠好。
  • 自下而上
  • 我們注意到,在完全二叉樹中,最后一個元素的下標除以2就能得到最后一個非葉子節點元素的下標n/2,光是葉子節點是無法進行堆化的,因此我們從n/2開始往前一直到下標為1為止不斷進行堆化,然后形成一個大頂堆;此過程就類似刪除堆頂元素之后的堆化過程;其時間復雜度為O(n),優于第一種。

建堆時自下而上進行堆化的過程

2.2 排序

經過上一步的建堆操作,我們得到了一個大頂堆,但是數組中的數據看上去仍然是無序的,我們需要基于這個大頂堆把數組排下序。

首先從堆頂取出元素,這個元素肯定是最大的,把它和數組最后一個元素進行交換,放到位置n,然后堆中剩下的元素不斷地進行堆化,并始終取堆頂元素依次放到n-1,n-2,n-3的位置上,當堆中只剩最后一個元素的時候,此時數組就是一個有序數列了。

堆排序的過程示意

堆排序的過程中,我們需要對n個元素進行堆化操作,每次堆化操作時間復雜度取決于完全二叉樹的高度,所以最終得到堆排序的時間復雜度為O(nlogn)。

堆排序不需要借助很多的額外存儲空間,因此它屬于原地排序;

堆排序過程中會可能改變相同值的位置,所以不是穩定的排序算法;

2.3 堆排序和快速排序的比較

雖然堆排序和快速排序時間的時間復雜度都是O(nlogn),但通常都認為堆排序的性能是比不上快速排序的。

  • 堆排序的堆化過程中,在比較和交換元素時,讀取的數據并不是局部順序的;快速排序就是局部順序的;所以快速排序更加顯得CPU緩存友好,性能也會相對較好;
  • 對于同樣的數列,堆排序數據的交換次數要多于快速排序;

三、堆排序的應用

3.1 堆排序

如上已經講解過了。

3.2 優先級隊列

優先級隊列中,數據的出隊不是按照入隊先后來決定的,而是按照優先級來的,優先級高(低)的就先出隊,實現優先級隊列的方法有很多,但是其中使用堆來實現是最為快捷高效的。比如Java中的PriorityQueue。

場景一:合并有序小文件

假設我們有n個小文件,每個大小為100MB,每個文件中存放的都是有序的字符串,我們如何把這n個小文件中的字符串有序地全都合并到一個大文件中呢?

這里有兩個方法:

  • 按照歸并排序中的合并思路
  • 設置n個指針各自指向每個文件的第一個字符串,將它們都加載到一個大小為n的數組中;
  • 然后對數組進行遍歷尋找最小元素,時間復雜度為O(n);并從數組中取出最小元素放到大文件中,將該元素從數組中刪除;
  • 將該元素來源的小文件中的指針移向下一位取出元素放到數組中,然后重復第二步;
  • 使用小頂堆
  • 設置n個指針各自指向每個文件的第一個字符串,將它們都加載到一個小頂堆中,初始是一個建堆的過程;
  • 取出堆頂元素放到大文件中,并將該元素從小頂堆的堆頂刪除,小頂堆會自動進行堆化;
  • 將該元素來源的小文件中的指針移向下一位取出元素插入小頂堆中,小頂堆會自動進行堆化,然后重復第二步;
  • 我們可以看到,這兩種方法的區別在于,前者需要每次遍歷數組找到最小值,后者則是有刪除和插入兩個堆化的過程。堆化過程的時間復雜度為O(logn),明顯比遍歷數組的O(n)要好,所以方法二更加高效。

場景二:實現高性能定時器

假設我們使用定時器設置了很多個待執行的任務,那么如何實現定時觸發這些提前設定好的任務呢?

這里說三個方法:

  • 程序每隔一段很小的時間(比如1秒)就進行任務掃描,找到最近要執行的任務進行執行,這種方法其實就是每1秒都要去尋找最小值,每次的時間復雜都是O(n),而且,假設最近一個任務是定在2小時候執行的,那么這2小時內,掃描程序都是白執行的,浪費資源。這種方法并不推薦。
  • 維護一個有序列表,比如使用快速排序,只要記住最小值的執行時間即可,等到了那個時間點程序再執行,如此掃描程序就不用一直去掃描了。
  • 使用小頂堆來維護任務列表,記住堆頂任務的執行時間,等到了那個時間點程序再執行,如此掃描程序就不用一直去掃描了。
  • 方法2和方法3其實是類似的,關鍵在于采取什么樣的數據結構和算法來獲取最小值。如果存在中途插入或者取消任務的情況,對于方法2來說,插入一個元素到有序列表中和從有序列表中刪除一個給定元素時間復雜度是多少呢?假設我們采用效率最高的二分查找,那么是O(logn),但是插入和刪除元素是要搬移元素的,這個時間是O(n),所以總的下來就是O(n);如果使用方法3,那么無論插入還是刪除元素,都是一個堆化的過程,時間復雜度為O(logn),所以方法3中使用堆更加高效。

3.3 求解Top-k問題

假設存量數據量為n,我們需要從n中找到Top-k的元素,并且針對不斷添加進來的數據,我們都要獲取最新的Top-k元素,這種問題應該怎么處理呢?

  • 先從n中取出前k個元素,組成一個小頂堆,此時堆頂元素是最小的,我們從K+1個元素開始,和堆頂元素進行比較,如果比堆頂元素小,那么不做處理,繼續下一個;如果比堆頂元素大,那么把堆頂元素刪除,并插入k+1這個元素;等到n個元素全部遍歷完,那么小頂堆中的k個元素就是Top-k數據了;
  • 對于外部不斷添加進來的數據其實思路是一樣的,把它當成數據源,不斷地和堆頂元素比較,重復上面的步驟操作即可。

時間主要耗費在一開始k個元素的初始建堆O(logk)上,還有刪除堆頂元素和插入新元素時的堆化O(logk)上;所以,總的時間復雜度應該為O(nlogk),比使用排序來獲取Top-k的O(nlogn)還是要高效的。

3.4 求解中位數

對于一個無序的數列,怎么求出它的中位數呢?這要看數列是靜態的還是動態的。

如果是靜態的數列,那么我們先進行排序,比如快速排序O(nlogn),然后如果總數是奇數,那么中位數就在n/2+1的位置上;如果總數是偶數,那么中位數有兩個,在n/2和n/2+1的位置上,隨便取一個即可??偟臅r間復雜度就是排序算法的時間復雜度O(nlogn)。

那如果是動態數列呢,我們需要維護數列的有序性,那么勢必要對新插入或者需要刪除的數據進行查找,時間復雜度為O(n),還有數據搬移的O(n),所以就會變得很低效,我們需要使用堆來解決這個問題。

我們先將已有數據排序,然后維護一個大頂堆和一個小頂堆,其中小頂堆存放最大的n/2個數據,堆頂元素是這n/2中最小的,大頂堆存放剩下的元素,堆頂元素是最大的。此時,中位數就是大頂堆的堆頂元素。

當動態數據添加進來時,我們將待添加元素和大頂堆的堆頂元素進行比較,如果小于等于,那么就插入大頂堆中;否則就和小頂堆的堆頂元素比較,如果大于等于,就插入小頂堆中。此時,如果小頂堆中的個數超過了n/2,就需要不斷地取出堆頂元素插入到大頂堆中,直至個數為n/2;如果小頂堆中的個數小于n/2,就需要不斷地取出大頂堆的堆頂元素插入到小頂堆中,直至小頂堆個數為n/2;

動態數列使用堆求解中位數過程示意

通過如上的過程,我們每次從大頂堆堆頂取出來的元素就是整個數列的中位數。整個過程的時間復雜度是多少呢?一開始初始化時的排序和建堆,由于數據比較少,可以算作常量;后續動態數據的插入或者刪除,就是一個堆化的過程,時間復雜度為O(logn);大頂堆和小頂堆之間元素個數的調整不會有很多元素,所以也算作常數;因此,總的時間復雜度就是O(logn)。

既然動態數列求解中位數使用堆比較好,為什么靜態數列求解中位數不使用堆,而是排序呢?靜態數列也可以使用如上堆的方案進行求解中位數,但是時間復雜度也是O(nlogn),和排序是一樣的,但是排序明顯更加地簡單,因此推薦使用排序的方案。

3.5 求解百分位數

求解中位數的問題其實就是求解百分位數問題的一種特殊情況, 中位數可以理解為百分位為50%,所以把中位數問題一般化的話,那么問題就是求解任意百分位數的問題。

思路和上述求解百分位是一樣的,比如我們要求解90%百分位的數,那么大頂堆中需要存放90%的數據,小頂堆中存放10%的數據,當動態地增加時需要依次和大頂堆、小頂堆的堆頂元素進行比較以決定插入到哪個堆中;如果插入或者刪除后,小頂堆中的數據占比不是10%了,就需要和大頂堆進行數據的交互以保證小頂堆數據的占比,如此才能保證大頂堆的堆頂元素就是我們需要的百分位數據。?

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2025-04-29 09:47:04

2024-12-31 07:56:33

Disruptor內存有界隊列消費模式

2022-07-24 21:56:38

元宇宙

2023-12-29 10:28:24

SPIJava靈活性

2023-04-03 11:01:26

低代碼平臺場景

2025-02-11 09:49:12

2021-09-07 14:17:12

區塊鏈版權技術

2021-06-11 10:20:23

區塊鏈大數據技術

2021-03-15 13:36:23

區塊鏈大數據技術

2021-09-28 16:22:48

區塊鏈大數據應用

2020-11-20 10:53:46

邊緣計算

2024-12-30 08:32:36

2025-01-15 07:54:02

2021-03-16 06:47:47

Python

2024-01-03 10:32:36

2020-10-16 09:09:20

機器學習銀行技術

2023-01-30 11:27:57

人工智能高性能計算CPU

2018-03-27 09:10:54

區塊鏈

2024-05-29 14:34:07

2023-05-16 07:47:18

RabbitMQ消息隊列系統
點贊
收藏

51CTO技術棧公眾號

国产精品美女久久福利网站| 国产综合久久| 欧美精品黑人性xxxx| 亚洲aⅴ天堂av在线电影软件| 最近日韩免费视频| 97精品在线| 精品国产成人在线影院| 欧美日韩在线视频一区二区三区| 国产一区二区影视| 久久精品国产久精国产| 欧美激情一级欧美精品| 老司机福利av| 粉嫩av国产一区二区三区| 亚洲电影一级黄| 神马影院我不卡午夜| 99热这里只有精品99| 136国产福利精品导航网址| 在线亚洲欧美视频| 中文字幕无人区二| 日韩色淫视频| 亚洲丶国产丶欧美一区二区三区| 日韩精品久久久| 亚洲精品一区二区三区不卡| 日本视频一区二区| 欧美精品videosex牲欧美| 一级黄色片大全| 午夜视频一区二区在线观看| 91黄色小视频| 日韩小视频在线播放| av片在线免费观看| 91伊人久久大香线蕉| 91久久综合亚洲鲁鲁五月天| 在线视频一区二区三区四区| 伊人狠狠色j香婷婷综合| 综合国产在线视频| 六月婷婷七月丁香| 国内精品偷拍| 欧美一区二区三区系列电影| 日本超碰在线观看| 成人影院av| 午夜久久福利影院| 污污污污污污www网站免费| 国产中文字幕在线观看| www国产精品av| 国产伦精品一区| 亚洲第九十九页| 国内精品视频666| 国产成+人+综合+亚洲欧洲| 日韩精品视频免费看| 中出一区二区| 日韩视频在线免费| 久久精品色妇熟妇丰满人妻| 日本道不卡免费一区| 亚洲欧美日韩视频一区| 中文字幕在线永久| 国产精品xxxav免费视频| 日韩欧美在线1卡| 欧美激情第四页| 亚洲狼人综合| 666欧美在线视频| 亚洲一级片av| 国产一区二区三区亚洲综合| 欧美高清精品3d| 亚洲天堂2018av| 欧洲亚洲精品| 欧美一区午夜精品| 99热这里只有精品2| 日韩在线成人| 亚洲国产第一页| 精品国产av色一区二区深夜久久 | 91精品国产综合久久久久久久久| 中文字幕精品一区二区精| 日韩成人一区二区| 国产精品一区二区三| 91精品视频免费在线观看| 精品一区二区三区香蕉蜜桃 | 哺乳一区二区三区中文视频| 欧美精品一区二区久久婷婷| 国产福利短视频| 精品理论电影在线| 日韩中文娱乐网| 中文字幕另类日韩欧美亚洲嫩草| 影音先锋久久久| 国产91精品视频在线观看| 久久久精品视频网站| 日本不卡一区二区三区 | 国内外免费激情视频| 国产精品99| 日韩欧美国产精品| 亚洲成人日韩在线| 久久国产精品亚洲人一区二区三区 | 欧美中文字幕一区二区三区亚洲| gogogo高清免费观看在线视频| gogo大尺度成人免费视频| 亚洲а∨天堂久久精品9966| 国产三级av在线播放| 五月久久久综合一区二区小说| 久久久久久久久中文字幕| 一级一片免费看| 国产精品综合视频| 麻豆成人小视频| 久久精品视频观看| 亚洲成人动漫在线观看| 校园春色 亚洲色图| 亚洲啊v在线免费视频| 日韩精品在线免费播放| 极品久久久久久| 噜噜噜躁狠狠躁狠狠精品视频| 成人精品在线视频| 日本私人网站在线观看| 亚洲天堂成人网| 日本老熟妇毛茸茸| 中文字幕一区日韩精品 | 国产精品乱码| 777电影在线观看| 亚洲va韩国va欧美va精品| 色片在线免费观看| 日韩欧美黄色| 色与欲影视天天看综合网| 国产美女www爽爽爽| 不卡av免费在线观看| 影音先锋在线亚洲| 欧洲亚洲两性| 亚洲第一免费播放区| 69夜色精品国产69乱| 久久影院亚洲| 精品国产一二| 久色国产在线| 3751色影院一区二区三区| 精品无码在线观看| 亚洲一区欧美二区| 亚洲自拍欧美色图| 在线播放麻豆| 欧美午夜精品一区二区三区 | 国产精品妹子av| 成年网站在线免费观看| swag国产精品一区二区| 久久夜色精品国产亚洲aⅴ| 探花国产精品一区二区| 久久先锋影音av鲁色资源| 欧美视频免费看欧美视频| 日韩在线亚洲| 久久影视电视剧免费网站| 中文字幕在线视频免费| 国产亚洲综合性久久久影院| 国产aaa一级片| 久久成人高清| 国产成人极品视频| 你懂的在线网址| 日韩欧美在线视频| 亚洲AV无码片久久精品| 快she精品国产999| 欧美日韩一区二区视频在线观看| 亚洲优女在线| 亚洲无线码在线一区观看| 亚洲图片在线视频| 久久精品亚洲一区二区三区浴池| 亚洲中文字幕无码中文字| 在线日本制服中文欧美| 日本亚洲精品在线观看| 成人在线观看免费| 欧美在线观看禁18| youjizz亚洲女人| 久草热8精品视频在线观看| 992tv成人免费观看| 天堂va在线高清一区| 欧美精品videossex性护士| 人妻91麻豆一区二区三区| 亚洲第一综合色| 91视频免费观看网站| 日本va欧美va欧美va精品| 亚洲一卡二卡三卡四卡无卡网站在线看| 日本电影久久久| 免费97视频在线精品国自产拍| 亚洲国产精品视频在线| 福利视频一区二区| 微拍福利一区二区| 精品写真视频在线观看| 成人在线免费高清视频| 欧美亚洲大陆| 国产精品视频成人| www.久久ai| 日韩精品免费在线观看| 一区二区视频网站| 亚洲黄色小视频| 野外性满足hd| 国精产品一区一区三区mba桃花 | 蜜桃麻豆91| 粉嫩av一区二区三区四区五区 | 正在播放亚洲| 激情小说一区| 国产精品久久久久久久久久久不卡| 免费av不卡| 亚洲国产一区二区三区在线观看| 国产精品露脸视频| 一区二区在线看| 李宗瑞91在线正在播放| 国产一区二三区好的| 亚洲熟妇无码另类久久久| 日韩成人影院| 国产欧美丝袜| 亚洲欧洲二区| 日本精品视频在线观看| av网址在线| 亚洲天堂免费视频| 精品国产免费无码久久久| 色哟哟精品一区| 欧美黑人一级片| 国产日韩精品一区二区三区在线| 能看毛片的网站| 免费成人美女在线观看| 男人日女人视频网站| 97国产成人高清在线观看| 久久久久网址| 亚洲一区二区三区免费| 国产日韩精品入口| 欧美性xxx| 91黑丝高跟在线| 亚洲精品白浆| 中文字幕欧美在线| 涩涩视频在线观看免费| 精品国产自在久精品国产| 亚洲一级片免费看| 欧美天堂在线观看| 国产在线一区视频| 中文字幕一区二区三区乱码在线 | 亚洲欧美国产毛片在线| 欧美熟妇激情一区二区三区| 91在线一区二区| 一区二区三区四区影院| 久久97超碰色| 中文字幕av不卡在线| 久久中文在线| av免费中文字幕| 亚洲精品免费观看| 日本中文字幕在线视频观看| 天天插综合网| 亚洲综合五月天| 日韩欧美高清在线播放| 欧美激情第一页在线观看| 欧美电影在线观看免费| 国产日韩欧美精品| 丁香婷婷成人| 激情欧美一区二区三区中文字幕| 97se亚洲| 国产一区二区免费电影| 国产精品45p| 国产欧美日韩伦理| 中文字幕日韩在线| 国产精品一区二区在线观看| ccyy激情综合| 九色视频成人porny| 美国成人xxx| 欧美精品与人动性物交免费看| 日日狠狠久久偷偷综合色| 精品欧美一区二区久久久伦| 色吊丝一区二区| 日本视频一区二区不卡| 国产一区二区区别| 亚洲高清在线观看一区| 国产韩日影视精品| 亚洲天堂第一区| 亚洲网址在线| 欧美老熟妇喷水| 日韩电影在线一区二区三区| 亚洲天堂av线| 国产一区二区免费看| 中文字幕欧美视频| 成人午夜电影网站| 国产高清自拍视频| 欧美激情在线一区二区三区| 精品在线观看一区| 一区二区三区在线观看视频| 国产第一页在线播放| 疯狂蹂躏欧美一区二区精品| 超碰在线免费97| 日韩一区二区在线观看视频 | 中文字幕久久亚洲| 国产成人在线视频免费观看| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 欧美成年人视频网站| a国产在线视频| 国产精品久久久久久久久久| 国产电影一区二区| 精品国产乱码一区二区三区四区 | 久久久国产视频| 91高清视频在线观看| 国产成人久久久精品一区| 曰本一区二区| 久草精品电影| 欧美超碰在线| 人妻熟妇乱又伦精品视频| 麻豆成人久久精品二区三区红| 男人操女人下面视频| 久久免费的精品国产v∧| 国产精品suv一区二区88 | 天堂网中文字幕| 666欧美在线视频| 免费在线视频一级不卡| 久久亚洲精品网站| 韩漫成人漫画| av一区二区三区在线观看| 国产va免费精品观看精品视频| 欧美三级午夜理伦三级老人| 另类国产ts人妖高潮视频| 国产成人精品综合久久久久99| 久久久亚洲国产美女国产盗摄| 人妻少妇精品一区二区三区| 色94色欧美sute亚洲线路二| 成人精品在线播放| 中文字幕一区电影| 天堂中文最新版在线中文| 91在线观看欧美日韩| 国产一区二区三区四区大秀| 真人抽搐一进一出视频| 久久国产精品区| av黄色免费网站| 亚洲成av人在线观看| 国产丝袜在线视频| 伊人激情综合网| 成人免费直播| 国内一区二区在线视频观看 | 欧美精品做受xxx性少妇| 蜜桃视频成人m3u8| 精品一区二区三区日本| 欧美涩涩网站| 一级 黄 色 片一| 国产精品久久久久久妇女6080 | 欧美videos中文字幕| 日本黄色片在线观看| 国产成人激情视频| 中文字幕中文字幕精品| 国产资源在线视频| 成人夜色视频网站在线观看| 青青草手机视频在线观看| 555www色欧美视频| 日本在线看片免费人成视1000| 日本高清+成人网在线观看| 秋霞在线一区| 91专区在线观看| 99久久综合精品| 日韩成年人视频| 精品国产百合女同互慰| 欧美韩日亚洲| 成人av片网址| 亚洲国产免费看| 亚洲精品乱码久久| 午夜欧美2019年伦理| 五月婷婷丁香花| 欧美怡红院视频一区二区三区| 国产区精品视频在线观看豆花| 免费高清一区二区三区| 成人毛片老司机大片| 国产一级做a爰片在线看免费| 精品少妇一区二区三区在线播放 | 欧美三区不卡| 日本三级日本三级日本三级极| 亚洲风情在线资源站| 五月婷婷综合久久| 欧美重口另类videos人妖| 精品在线观看入口| 中文字幕国产传媒| 国产精品污www在线观看| 一级黄色小视频| 欧美成人一区在线| 国产精品nxnn| 国语对白做受xxxxx在线中国| 国产欧美日韩在线看| 国产精品探花视频| 久久6免费高清热精品| 精品国产午夜肉伦伦影院| 成人在线免费观看av| 国产丝袜在线精品| 一级黄色片在线| 久久久久久国产精品美女| 亚洲资源网你懂的| 在线观看亚洲色图| 亚洲欧美一区二区三区孕妇| 亚洲成人第一区| 日韩av大片在线| 婷婷色综合网| 免费成人蒂法网站| 欧美午夜精品久久久久久超碰| mm1313亚洲国产精品美女| 国产伦精品一区二区三毛| 日韩电影在线一区| 强行糟蹋人妻hd中文| 精品视频久久久久久| 日韩综合久久| 精品久久一二三| 国产精品高潮呻吟| 熟妇人妻中文av无码| 国产精品日韩欧美综合| 好吊日精品视频| 欧美亚洲色综久久精品国产| 精品国产一区二区三区av性色| 97精品国产综合久久久动漫日韩 | 又色又爽的视频| 亚洲国产精品中文| 亚洲狼人在线|