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

每日算法:數據流的中位數

開發 前端 算法
如果插入元素比大頂堆的堆頂要大,則將該元素插入到小頂堆中;如果要小,則插入到大頂堆中。

[[431427]]

本文轉載自微信公眾號「三分鐘學前端」,作者sisterAn  。轉載本文請聯系三分鐘學前端公眾號。

中位數是有序列表中間的數。如果列表長度是偶數,中位數則是中間兩個數的平均值。

例如,

[2,3,4] 的中位數是 3

[2,3] 的中位數是 (2 + 3) / 2 = 2.5

設計一個支持以下兩種操作的數據結構:

  • void addNum(int num)- 從數據流中添加一個整數到數據結構中。
  • double findMedian() - 返回目前所有元素的中位數。

示例:

  1. addNum(1) 
  2. addNum(2) 
  3. findMedian() -> 1.5 
  4. addNum(3)  
  5. findMedian() -> 2 

進階:

  • 如果數據流中所有整數都在 0 到 100 范圍內,你將如何優化你的算法?
  • 如果數據流中 99% 的整數都在 0 到 100 范圍內,你將如何優化你的算法?

看到這個動態數組獲取中位數問題,不要太激動,這太適合使用堆了,考察的就是堆的經典應用:中位數問題,詳情可查看 前端進階算法9:看完這篇,再也不怕堆排序、Top K、中位數問題面試了

解法:利用堆

解題思路:

這里需要維護兩個堆:

  • 大頂堆:用來存取前 n/2 個小元素,如果 n 為奇數,則用來存取前 Math.floor(n/2) + 1 個元素
  • 小頂堆:用來存取后 n/2 個小元素

那么,根據題目要求,中位數就為:

  • n 為奇數:中位數是大頂堆的堆頂元素
  • n 為偶數:中位數是大頂堆的堆頂元素與小頂堆的堆頂元素的平均值

當數組為動態數組時,每當數組中插入一個元素時,都需要如何調整堆喃?

如果插入元素比大頂堆的堆頂要大,則將該元素插入到小頂堆中;如果要小,則插入到大頂堆中。

當插入完成后,如果大頂堆、小頂堆中元素的個數不滿足我們已上的要求,我們就需要不斷的將大頂堆的堆頂元素或小頂堆的堆頂元素移動到另一個堆中,直到滿足要求

代碼實現:

  1. let MedianFinder = function() { 
  2.     // 大頂堆,用來保存前 n/2 小的元素 
  3.     this.lowHeap = new MaxHeap() 
  4.     // 小頂堆,用來保存后 n/2 小的元素 
  5.     this.hightHeap = new MinHeap() 
  6. }; 
  7. // 插入元素 
  8. MedianFinder.prototype.addNum = function(num) { 
  9.     // 如果大頂堆為空或大頂堆堆頂元素小于num,則插入大頂堆 
  10.     // 否則插入到小頂堆中 
  11.     if(!this.lowHeap.getSize() || num < this.lowHeap.getHead()) { 
  12.         // 比大頂堆的堆頂小,插入到大頂堆中 
  13.         this.lowHeap.insert(num) 
  14.     } else { 
  15.         // 比小頂堆的堆頂大,插入到小頂堆中 
  16.         this.hightHeap.insert(num) 
  17.     } 
  18.  
  19.     // 比較大小頂堆的是否依然保持平衡 
  20.     if(this.lowHeap.getSize() - this.hightHeap.getSize() > 1) { 
  21.         // 大頂堆往小頂堆遷移 
  22.         this.hightHeap.insert(this.lowHeap.removeHead()) 
  23.     } 
  24.     if(this.hightHeap.getSize() > this.lowHeap.getSize()) { 
  25.         // 小頂堆向大頂堆遷移 
  26.         this.lowHeap.insert(this.hightHeap.removeHead()) 
  27.     } 
  28. }; 
  29. // 獲取中位數 
  30. MedianFinder.prototype.findMedian = function() { 
  31.     if(this.lowHeap.getSize() && this.lowHeap.getSize() === this.hightHeap.getSize()) { 
  32.         return (this.lowHeap.getHead() + this.hightHeap.getHead())/2 
  33.     } 
  34.     return this.lowHeap.getHead() 
  35. }; 

其中小頂堆定義:

  1. // 小頂堆 
  2. let MinHeap = function() { 
  3.     let heap = [,] 
  4.     // 堆中元素數量 
  5.     this.getSize = ()=> heap.length - 1 
  6.     // 插入 
  7.     this.insert = (key) => { 
  8.         heap.push(key
  9.         // 獲取存儲位置 
  10.         let i = heap.length-1 
  11.         while (Math.floor(i/2) > 0 && heap[i] < heap[Math.floor(i/2)]) {   
  12.             swap(heap, i, Math.floor(i/2)); // 交換  
  13.             i = Math.floor(i/2);  
  14.         } 
  15.     } 
  16.     // 刪除堆頭并返回 
  17.     this.removeHead = () => { 
  18.         if(heap.length > 1) { 
  19.             if(heap.length === 2) return heap.pop() 
  20.             let num = heap[1] 
  21.             heap[1] = heap.pop() 
  22.             heapify(1) 
  23.             return num 
  24.         } 
  25.         return null 
  26.     } 
  27.     // 獲取堆頭 
  28.     this.getHead = () => { 
  29.         return heap.length > 1 ? heap[1]:null 
  30.     } 
  31.     // 堆化 
  32.     let heapify = (i) => { 
  33.         let k = heap.length-1 
  34.         // 自上而下式堆化 
  35.         while(true) { 
  36.             let minIndex = i 
  37.             if(2*i <= k && heap[2*i] < heap[i]) { 
  38.                 minIndex = 2*i 
  39.             } 
  40.             if(2*i+1 <= k && heap[2*i+1] < heap[minIndex]) { 
  41.                 minIndex = 2*i+1 
  42.             } 
  43.             if(minIndex !== i) { 
  44.                 swap(heap, i, minIndex) 
  45.                 i = minIndex 
  46.             } else { 
  47.                 break 
  48.             } 
  49.         } 
  50.     }  
  51.     let swap = (arr, i, j) => { 
  52.         let temp = arr[i] 
  53.         arr[i] = arr[j] 
  54.         arr[j] = temp 
  55.     } 

大頂堆定義:

  1. // 大頂堆 
  2. let MaxHeap = function() { 
  3.     let heap = [,] 
  4.     // 堆中元素數量 
  5.     this.getSize = ()=>heap.length - 1 
  6.     // 插入大頂堆 
  7.     this.insert = (key) => { 
  8.         heap.push(key
  9.         // 獲取存儲位置 
  10.         let i = heap.length-1 
  11.         while (Math.floor(i/2) > 0 && heap[i] > heap[Math.floor(i/2)]) {   
  12.             swap(heap, i, Math.floor(i/2)); // 交換  
  13.             i = Math.floor(i/2);  
  14.         } 
  15.     } 
  16.     // 獲取堆頭 
  17.     this.getHead = () => { 
  18.         return heap.length > 1 ? heap[1]:null 
  19.     } 
  20.     // 刪除堆頭并返回 
  21.     this.removeHead = () => { 
  22.         if(heap.length > 1) { 
  23.             if(heap.length === 2) return heap.pop() 
  24.             let num = heap[1] 
  25.             heap[1] = heap.pop() 
  26.             heapify(1) 
  27.             return num 
  28.         } 
  29.         return null 
  30.     } 
  31.     // 堆化 
  32.     let heapify = (i) => { 
  33.         let k = heap.length-1 
  34.         // 自上而下式堆化 
  35.         while(true) { 
  36.             let maxIndex = i 
  37.             if(2*i <= k && heap[2*i] > heap[i]) { 
  38.                 maxIndex = 2*i 
  39.             } 
  40.             if(2*i+1 <= k && heap[2*i+1] > heap[maxIndex]) { 
  41.                 maxIndex = 2*i+1 
  42.             } 
  43.             if(maxIndex !== i) { 
  44.                 swap(heap, i, maxIndex) 
  45.                 i = maxIndex 
  46.             } else { 
  47.                 break 
  48.             } 
  49.         } 
  50.     }  
  51.     let swap = (arr, i, j) => { 
  52.         let temp = arr[i] 
  53.         arr[i] = arr[j] 
  54.         arr[j] = temp 
  55.     } 

復雜度分析:

時間復雜度:由于插入元素到堆的時間復雜度為 O(logn),為樹的高度;移動堆頂元素都需要堆化,時間復雜度也為O(logn);所以,插入( addNum )的時間復雜度為 O(logn) ,每次插入完成后求中位數僅僅需要返回堆頂元素即可, findMedian 時間復雜度為 O(1)

空間復雜度:O(n)

如果數據流中所有整數都在 0 到 100 范圍內,我們可以嘗試使用計數排序,但計數排序的時間復雜度是O(n + m),其中 m 表示數據范圍,復雜度較高,這里不適合,計數排序比較適合靜態數組前k個最值問題 leetcode347:前 K 個高頻元素

leetcode:https://leetcode-cn.com/problems/find-median-from-data-stream/solution/javascriptshu-ju-liu-de-zhong-wei-shu-by-user7746o/

 

責任編輯:武曉燕 來源: 三分鐘學前端
相關推薦

2021-06-29 19:24:42

數據流數據排序

2017-11-16 19:26:34

海量數據算法計算機

2011-12-14 15:57:13

javanio

2016-11-14 19:01:36

數據流聊天系統web

2009-08-19 10:41:12

Java輸入數據流

2022-03-18 08:57:17

前端數據流選型

2011-04-14 14:43:38

SSISTransformat

2012-07-30 08:31:08

Storm數據流

2019-12-19 14:38:08

Flink SQL數據流Join

2011-04-19 09:18:02

SSIS數據轉換

2013-10-21 10:58:50

微軟大數據SQL Server

2009-07-15 09:06:11

Linux圖形系統X11的CS架構

2014-02-11 08:51:15

亞馬遜PaaSAppStream

2014-12-02 10:56:47

TCPIP交互數據流

2020-02-06 19:12:36

Java函數式編程編程語言

2020-08-20 11:24:31

物聯網數據技術

2023-08-31 16:47:05

反應式編程數據流

2023-03-17 07:39:54

開源數據流技術

2024-04-18 09:02:11

數據流Mixtral混合模型

2010-04-30 09:53:34

Unix系統
點贊
收藏

51CTO技術棧公眾號

久久超碰99| 日韩中文字幕一区| 99在线免费视频观看| 亚洲欧美视频在线播放| 神马午夜在线观看| 欧美成人精品一区二区三区在线看| 亚洲一区在线观看视频| 日韩美女写真福利在线观看| 人妻巨大乳一二三区| 免费a在线观看| av在线播放一区二区| 久久久久久久久久久久久夜| 久久久久久97| 日本一二三四区视频| 阿v免费在线观看| 亚洲一区中文| 精品99一区二区三区| 四虎一区二区| 国产精品乱码一区二区视频| 国产精品香蕉| 亚洲一区二区免费视频| 欧美一区二区三区四区夜夜大片 | 欧美大片欧美激情性色a∨久久| 国产免费视频传媒| 免费a在线观看| 国产suv精品一区二区6| 久久国产精品影片| 一级黄色高清视频| 日本美女一区| 国产精品视频麻豆| 国产美女被下药99| 亚洲一区电影在线观看| а天堂中文最新一区二区三区| 欧美日韩国产精品一区| 精品蜜桃传媒| 中文字幕在线播| 精品一二三区| 欧美日韩精品一区二区天天拍小说 | 日本视频在线观看免费| 欧美自拍一区| 日本高清不卡视频| 无遮挡亚洲一区| 欧美视频免费一区二区三区| www.成人在线| 奇米四色中文综合久久| av女人的天堂| 欧美成人xxxx| 亚洲桃色在线一区| 国产精品乱码一区二区三区| 成人免费区一区二区三区| 久久99久久人婷婷精品综合 | 国产精品高潮在线| 免费黄色在线网址| 激情综合五月| 五月天欧美精品| 色综合久久88色综合天天提莫| 欧美一级在线免费观看| 亚洲在线黄色| 91精品国产91久久久久久吃药| 一区二区三区免费在线观看视频| 国产丝袜一区| 亚洲精品美女久久久久| 欧美黄色一级片视频| 黄色片免费在线观看| 国产精品乡下勾搭老头1| 97在线看免费观看视频在线观看| 快灬快灬一下爽蜜桃在线观看| 亚洲人和日本人hd| 日韩午夜三级在线| 动漫av免费观看| 国产一区二区主播在线| 亚洲综合久久久久| 亚洲成人在线视频网站| 天堂av中文字幕| 国产精品一区二区男女羞羞无遮挡| 69堂成人精品视频免费| 国产suv精品一区二区33| 久久中文欧美| 国语自产精品视频在线看| 91ts人妖另类精品系列| 欧美美女在线直播| 亚洲情综合五月天| 免费黄色av网址| 久久xxx视频| 欧美精品xxxxbbbb| 手机在线免费观看毛片| 欧美xxxx黑人又粗又长| 亚洲国产岛国毛片在线| 国产精品日韩一区二区三区| 午夜性色福利影院| 成人免费高清在线| 91久久国产自产拍夜夜嗨| 亚洲第一视频在线播放| 精品在线免费观看| 国产激情999| 成人免费视频毛片| 激情综合中文娱乐网| 最新的欧美黄色| 右手影院亚洲欧美| 欧美电影《睫毛膏》| 欧美黄色成人网| 成人av网站在线播放| 国产另类ts人妖一区二区| 精品国产一区二区三区四区精华| 成年人视频网站在线| 一区二区三区中文字幕| 国产香蕉一区二区三区| 婷婷在线视频| 中文字幕欧美日本乱码一线二线| 玖玖精品在线视频| 黄在线免费看| 精品久久香蕉国产线看观看gif| 嫩草影院国产精品| 国产精品xxx| 欧美日韩精品系列| 五月开心播播网| 色婷婷av一区二区三区丝袜美腿| 日韩av在线天堂网| 手机在线免费看片| 女人色偷偷aa久久天堂| 日韩中文字幕免费| 波多野结衣久久久久| 亚洲看片一区| 日本aⅴ大伊香蕉精品视频| 国产jzjzjz丝袜老师水多| 精品一区二区三区免费| 免费成人深夜夜行视频| 国内精品在线视频| 国产精品色一区二区三区| 免费看日本毛片| 最新日韩三级| 亚洲精品二三区| 9.1成人看片免费版| 欧美日韩一区二区三区四区在线观看 | 人妻巨大乳一二三区| 久久国产中文字幕| 欧美久久久精品| 久久国产精品波多野结衣| 韩国亚洲精品| 清纯唯美亚洲综合| 少妇一级淫片免费看| 伊人夜夜躁av伊人久久| 一本一道久久a久久综合蜜桃| 97精品资源在线观看| 亚洲人成网在线播放| av黄色在线看| 91麻豆免费观看| 亚洲视频在线观看日本a| av官网在线播放| 黑人精品xxx一区一二区| 熟女人妻一区二区三区免费看| 亚洲区综合中文字幕日日| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲一区中文字幕永久在线| 国产一区二区成人久久免费影院 | 欧美激情视频在线观看| 精品国产av一区二区三区| 99热在这里有精品免费| 免费看黄在线看| 欧美成人福利| 欧美老少做受xxxx高潮| 成人免费一级视频| 国产亚洲一区二区三区| 日本一本草久p| 亚洲超碰在线观看| 国产亚洲欧美另类中文| 538精品在线观看| 肉色丝袜一区二区| 国产精品久久波多野结衣| 深夜国产在线播放| 欧美主播一区二区三区| 91丝袜在线观看| 国产精品久久久久久| 欧美亚洲成人xxx| www.久久久久久久久久| 亚洲成a人片在线观看中文| 久久久久狠狠高潮亚洲精品| 精品中文字幕一区二区三区| 欧美激情a在线| 男人天堂资源在线| 欧美高清激情brazzers| 欧美日韩中文视频| 国产精品一区二区你懂的| av在线观看地址| av中文一区| 91网免费观看| 欧美电影免费观看高清完整| 日韩亚洲在线观看| 色窝窝无码一区二区三区成人网站| 色哟哟在线观看一区二区三区| 成人做爰www看视频软件| 91精品啪在线观看国产18| 国产精品96久久久久久| 国产在线高清视频| 日韩精品欧美国产精品忘忧草| 在线播放亚洲精品| 午夜影视日本亚洲欧洲精品| 少妇av片在线观看| 久久综合激情| www.成年人视频| 日韩欧美精品| 精品在线不卡| 美女精品久久| 国产精品久久久久久av福利软件 | 538国产精品视频一区二区| 欧美尤物美女在线| 欧美日韩激情在线| 日韩av在线播| 成人av综合一区| 成人午夜视频在线观看免费| 欧美综合在线视频观看| 国产欧美一区二区三区不卡高清| av在线最新| 精品国产自在久精品国产| 欧美精品入口蜜桃| 中文字幕欧美激情| 国产熟妇搡bbbb搡bbbb| 成人综合婷婷国产精品久久蜜臀| 亚洲欧美日韩中文在线| 四虎永久在线精品免费一区二区| 日韩一二三区| 国产日韩欧美在线观看| 女女色综合影院| 日韩精品中文字幕视频在线| 国产一级免费视频| 亚洲一区二区三区精品在线| 又色又爽的视频| 久久99精品国产91久久来源| av观看免费在线| 亚洲日本国产| 国产成a人亚洲精v品在线观看| 精品视频高潮| 日韩av电影手机在线| 丰满大乳少妇在线观看网站 | 五月天中文字幕在线| 丝袜亚洲另类欧美综合| 免费国产黄色网址| 亚洲青色在线| 人妻夜夜添夜夜无码av | 色综合色综合久久综合频道88| 一级毛片视频在线| 色婷婷综合成人| 自拍视频在线| 日韩欧美激情在线| 91视频免费网址| 亚洲电影第三页| 久久精品无码人妻| 午夜免费久久看| 日韩三级视频在线播放| 婷婷综合五月天| 日本视频在线观看免费| 91久久精品网| 中文字幕第三页| 亚洲国产精品麻豆| 久久精品国产亚洲av高清色欲 | 亚洲男人天天操| 手机看片福利永久| 亚洲人成免费电影| 在线国产91| 欧美大胆a视频| heyzo高清国产精品| 69av在线视频| 日韩在线免费| 欧美精品18videosex性欧美| 女同视频在线观看| 韩国三级日本三级少妇99| 三妻四妾完整版在线观看电视剧| 亚洲香蕉av在线一区二区三区| 久久久资源网| 久久久999精品免费| 精品视频一二三| 色系列之999| 永久免费网站在线| 91成人性视频| 国产乱子精品一区二区在线观看| 91网站在线看| 8av国产精品爽爽ⅴa在线观看| 国产精品自拍偷拍视频| 99久久激情视频| 蜜臀av性久久久久蜜臀aⅴ四虎| 国内自拍中文字幕| 亚洲理伦在线| 不卡的av中文字幕| 久久狠狠婷婷| 久操网在线观看| 丝袜诱惑亚洲看片 | 成人动漫视频在线| 欧美成人国产精品一区二区| 亚洲丝袜另类动漫二区| 日本三级片在线观看| 在线亚洲欧美专区二区| 国产露脸国语对白在线| 欧美性xxxxx极品少妇| 亚洲综合一二三| 欧美视频一区二区三区四区| 亚洲国产精品欧美久久| 亚洲视频在线观看| 色女人在线视频| 国产精品电影在线观看| 在线一区二区三区视频| 亚洲综合精品伊人久久| 伊人久久大香| 久久国产主播精品| 美女一区2区| 日韩欧美一区二区三区久久婷婷| 中文无码久久精品| 日本xxxxxxx免费视频| 国产成人精品午夜视频免费| 熟妇无码乱子成人精品| 精品亚洲porn| 人妻少妇偷人精品久久久任期| 97久久精品人人爽人人爽蜜臀| xfplay5566色资源网站| 国产日本欧美一区二区| 国产综合精品久久久久成人av | 日本一区网站| 国产激情综合| 成人激情免费在线| 久久亚洲人体| 久草热久草热线频97精品| 欧美一区二区三区久久精品| 国产又黄又猛又粗| 久久亚洲二区三区| 少妇特黄一区二区三区| 亚洲精品高清在线观看| 在线观看国产成人| 亚洲色图18p| 欧美激情喷水| 久精品国产欧美| 中文国产一区| 性一交一乱一伧国产女士spa| 麻豆精品精品国产自在97香蕉| 亚洲精品手机在线观看| 久久久久国产一区二区三区四区| 亚洲欧美在线观看视频| 日韩一级成人av| www在线视频| 久久久久久久999精品视频| 国产一区二区三区黄网站 | 91精品高清| 天天操天天干天天做| 一区在线观看免费| 久久国产精品二区| 日韩一级片网址| a视频在线免费看| 92福利视频午夜1000合集在线观看| 日韩欧美高清在线播放| 午夜精品中文字幕| 成人欧美一区二区三区白人| 一起草av在线| 亚洲精品国产suv| 国产不卡人人| 国产日韩在线亚洲字幕中文| 成人写真视频| 久艹视频在线免费观看| heyzo一本久久综合| 久久99精品波多结衣一区| 精品亚洲aⅴ在线观看| 欧美性xxx| 亚洲欧美日产图| 激情久久五月天| 69av.com| 亚洲第一偷拍网| 巨大荫蒂视频欧美另类大| 成人黄色免费看| 综合精品久久| 中文字幕在线视频播放| 精品日韩中文字幕| 国产高清视频在线播放| 欧美国产日本高清在线 | 精品少妇久久久| 精品欧美久久| 成人国产一区二区| 九九综合久久| 色综合天天色综合| 亚洲精品免费一二三区| 欧美一区,二区| 国产成人精品a视频一区www| 日本一区二区三区视频| 初高中福利视频网站| 精品成人乱色一区二区| 3d成人动漫在线| 91沈先生播放一区二区| 亚洲一区二区动漫| 呻吟揉丰满对白91乃国产区| 91精品国产高清一区二区三区蜜臀 | 免费成人深夜夜行网站| 精品国产3级a| 黄色精品视频| 日韩一级片免费视频| 国产视频亚洲色图| www日本高清| 日本人成精品视频在线| 66视频精品| a级大片在线观看| 五月天久久比比资源色| 午夜视频在线观看网站| 国产在线观看一区| 精品一区二区在线看| 亚洲久久在线观看|