精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

高清欧美性猛交xxxx| 色中色一区二区| 国产欧美韩日| 欧美精品aaaa| 日本中文字幕在线2020| 国产乱淫av一区二区三区| 欧美国产日韩视频| 久久丫精品忘忧草西安产品| 精品国产乱码一区二区三区 | 亚洲日本激情| 伊人伊人伊人久久| 激情小说欧美色图| 欧洲一级精品| 亚洲国产日日夜夜| 日韩少妇中文字幕| 蜜臀av在线观看| 日本不卡高清视频| 午夜精品一区二区三区视频免费看| 韩国女同性做爰三级| 麻豆国产一区| 欧美日韩一区二区不卡| 日本熟妇人妻xxxx| 麻豆传媒在线免费| 久久先锋影音av鲁色资源| 99re热精品| 在线免费看91| 久久精品国语| 久久久久国产精品一区| 三级影片在线观看| 亚洲精品无吗| 亚洲国产美女久久久久| 免费欧美一级片| 男人天堂久久| 在线观看欧美精品| 乱人伦xxxx国语对白| caopen在线视频| 中国色在线观看另类| 蜜桃成人在线| 五月婷婷六月激情| 欧美1区视频| 在线播放国产一区二区三区| 午夜av免费看| 国产成人夜色高潮福利影视| 午夜电影一区二区| 精品无码av无码免费专区| 1024国产在线| 欧美国产精品专区| 青娱乐国产91| 国产日产精品久久久久久婷婷| av成人免费在线| 国产午夜精品在线| 蜜桃久久一区二区三区| 粉嫩高潮美女一区二区三区| 亚洲综合中文字幕68页| 国产深喉视频一区二区| 狠狠色丁香久久婷婷综合_中| 日韩视频免费看| 日本黄色小视频在线观看| 妖精视频一区二区三区| 亚洲欧美国产va在线影院| 中文字幕丰满乱码| 久久久久久久性潮| 欧美伦理视频网站| 免费网站在线观看黄| 亚洲国产伊人| 日韩一区二区三区视频在线观看| 深夜做爰性大片蜜桃| 午夜视频在线观看精品中文| 日韩欧美的一区| 欧美精品一区二区三区免费播放| 免费在线小视频| 欧美视频精品一区| 国产免费人做人爱午夜视频| 欧美性suv| 亚洲精品国久久99热| 免费看日b视频| 丁香花在线高清完整版视频| 精品欧美一区二区三区| 国产免费毛卡片| 国产精品字幕| 欧美电影在线免费观看| 一级黄色免费毛片| 欧美理伦片在线播放| 亚洲老头同性xxxxx| 欧美波霸videosex极品| 在线国产一区| 91高清在线免费观看| 国产女主播喷水视频在线观看| 国产精品国产三级国产在线观看 | 99精品99久久久久久宅男| 男人天堂综合网| 久久久精品tv| 99久久国产免费免费| 搡老岳熟女国产熟妇| 久久九九久久九九| 艳母动漫在线观看| 欧美13videosex性极品| 欧美丰满高潮xxxx喷水动漫| 亚洲成年人在线观看| 国产一区二区三区日韩精品 | 国产日韩欧美一区二区| 国产理论电影在线观看| 亚洲人成在线观看一区二区| 日韩伦理在线免费观看| 久久精品国产精品亚洲毛片| 亚洲成人aaa| 国产精品igao网网址不卡| 99a精品视频在线观看| 亚洲人成在线电影| 黄色在线观看免费| 天天操夜夜操国产精品| 高清欧美一区二区三区| 亚洲天堂视频在线| 91色九色蝌蚪| 女人床在线观看| jizz亚洲女人高潮大叫| 欧美精品一区二区在线观看| 国产免费嫩草影院| 极品中文字幕一区| 欧美成人精品在线播放| 精品欧美一区二区三区免费观看| 久草这里只有精品视频| 快播亚洲色图| 青草影视电视剧免费播放在线观看| 国产精品成人免费在线| www.爱色av.com| 国产激情在线播放| 3d成人动漫网站| 夜夜爽久久精品91| 激情五月综合网| 午夜精品久久久久久久男人的天堂| 亚洲一区 中文字幕| 久久久青草青青国产亚洲免观| 国产高清不卡无码视频| 亚洲伊人精品酒店| 国产亚洲a∨片在线观看| 俄罗斯毛片基地| 校园激情久久| 精品亚洲第一| 91资源在线观看| 精品剧情v国产在线观看在线| 偷拍夫妻性生活| 老鸭窝毛片一区二区三区| 久久精品国产第一区二区三区最新章节| 伊人222成人综合网| 51午夜精品国产| 天天操夜夜操av| 黑人巨大精品欧美一区| 在线观看成人一级片| 欧美成人aaa| 神马久久桃色视频| 一级片免费网站| 中文字幕一区在线观看| 想看黄色一级片| 伊人情人综合网| 成人av影视在线| 91桃色在线观看| 日韩精品极品在线观看| 特级毛片www| 成人精品视频一区二区三区| 欧美视频在线观看视频| 麻豆精品少妇| 人人做人人澡人人爽欧美| 涩爱av在线播放一区二区| 欧美性生交大片免网| 熟女俱乐部一区二区| 日韩av电影免费观看高清完整版| 日韩精彩视频| 9999精品免费视频| 九九视频直播综合网| 国产 日韩 欧美 综合| 午夜天堂影视香蕉久久| 在线不卡av电影| 久久99深爱久久99精品| 免费观看国产视频在线| 第四色中文综合网| 欧美一区亚洲一区| 1024视频在线| 精品国产精品网麻豆系列| 欧美精品韩国精品| 国产成人在线色| 欧美日韩性生活片| 精品视频网站| 91成人免费在线观看| cao在线视频| 国产一区二区三区在线播放免费观看 | 国产精品视屏| 国产精品pans私拍| 亚洲精品国产av| 欧美日韩综合视频网址| 欧美亚洲色综久久精品国产| 国模大尺度一区二区三区| 欧美一级免费播放| 第一会所sis001亚洲| 欧美激情在线播放| 欧美孕妇孕交| 欧美一区二区三区啪啪| 亚洲天堂av片| 亚洲精品中文在线| 一区二区黄色片| 国产精品99久久久久久宅男| 美女av免费在线观看| 亚洲高清资源在线观看| 美国av一区二区三区| 婷婷激情成人| 欧洲精品毛片网站| 91一区二区三区在线| 亚洲欧美国产精品| 午夜精品无码一区二区三区| 在线视频国内自拍亚洲视频| 久久久国产成人| 中文字幕欧美一| 尤物视频最新网址| 国产不卡在线视频| wwwwwxxxx日本| 久久亚洲电影| 黄色一级在线视频| 欧美国产先锋| 亚洲看片网站| 国产日产一区| 精品一区久久久久久| 亚洲精品国产九九九| 成人激情免费在线| 日韩网站中文字幕| 欧美在线视频一区二区| 爱啪视频在线观看视频免费| 欧美成人国产va精品日本一级| 成人性生交大片免费看午夜| 亚洲国产成人久久| 午夜精品久久久久久久99老熟妇| 538prom精品视频线放| 最好看的日本字幕mv视频大全 | 欧美一区二区三区啪啪| 中文字幕在线网站| 欧美最猛黑人xxxxx猛交| 久久国产黄色片| 大伊人狠狠躁夜夜躁av一区| 久久久精品国产sm调教| 一区二区欧美视频| 国产va在线播放| 亚洲日韩欧美一区二区在线| 手机免费观看av| 欧美韩日一区二区三区| 在哪里可以看毛片| 久久久精品免费观看| 国产精品20p| 欧美激情资源网| 中文字幕伦理片| 欧美激情一区二区三区| 最近中文字幕在线mv视频在线 | 日韩免费三级| 国内成人自拍| 色女人综合av| 日韩一区电影| 国产精品无码乱伦| 亚洲欧美亚洲| aa视频在线播放| 亚洲一区国产| xxxx一级片| 久久精品久久综合| 欧美精品色视频| 国产69精品久久777的优势| 国内精品免费视频| 972aa.com艺术欧美| 国产女主播喷水高潮网红在线| 国产人伦精品一区二区| 久久久免费看片| 亚洲美女偷拍久久| 日本三级中文字幕| 中文字幕一区日韩精品欧美| 久久久久久久久久97| 亚洲曰韩产成在线| av中文在线播放| 精品视频999| 午夜精品一区二区三| 亚洲第一页中文字幕| 黄色片视频在线观看| xvideos国产精品| 韩国日本一区| 国产精品96久久久久久又黄又硬| 小说区图片区亚洲| 国产精品日韩一区二区免费视频| 亚洲97av| 五月天综合婷婷| 9色精品在线| 91女神在线观看| 成人小视频免费观看| 日本高清www| 亚洲视频一区在线观看| 奇米影视第四色777| 亚洲精品乱码久久久久久日本蜜臀| 亚洲国产精品成人无久久精品| 色综合久久综合网97色综合 | 日韩女同互慰一区二区| 天堂成人在线| 久久天天躁狠狠躁老女人| 欧美aa在线观看| 91久久国产精品91久久性色| 久久人人爽人人爽人人片av不| 亚洲精品乱码视频| 亚洲午夜黄色| 亚洲欧美日韩精品一区| 99精品黄色片免费大全| 一级黄色片日本| 欧美性猛交99久久久久99按摩| 国产原创中文av| 亚洲欧美一区二区三区在线| 69xxx在线| 国产精品日韩欧美大师| 欧美日韩一区二区三区在线电影| 中文字幕久久一区| 久久这里只有| 波多野结衣加勒比| 又紧又大又爽精品一区二区| 国产精品免费无遮挡无码永久视频| 日韩欧美亚洲国产另类| 在线毛片网站| 国产精品久久久久久久久久ktv| 东京久久高清| japanese在线播放| 激情五月激情综合网| 中日韩精品一区二区三区| 亚洲午夜av在线| 国产国语亲子伦亲子| 日韩在线视频免费观看高清中文| 亚洲欧洲美洲av| 日韩美女在线看| 都市激情亚洲欧美| 成人在线观看毛片| 国产美女精品人人做人人爽| 网爆门在线观看| 欧美在线观看视频一区二区三区| 日本午夜在线视频| 性色av一区二区咪爱| 国产精品xxx在线观看| 国产精品国三级国产av| 国产一区91精品张津瑜| 日韩av片在线免费观看| 在线观看国产日韩| 可以在线观看的av| 欧美中文在线观看国产| 偷拍亚洲精品| 日韩在线一级片| 91蝌蚪porny九色| 国产无遮挡呻吟娇喘视频| 亚洲国产欧美一区| 免费成人在线电影| 欧美日韩最好看的视频| 亚洲免费影院| 影音先锋制服丝袜| 欧美在线免费视屏| 9i精品一二三区| 91精品视频专区| 欧美日本不卡高清| 国产综合内射日韩久| 欧美午夜片欧美片在线观看| 蜜桃视频在线观看视频| 国产精品亚洲аv天堂网| 91视频综合| 国产精品熟女一区二区不卡| 一级女性全黄久久生活片免费| 国产 日韩 欧美 精品| 国产91精品黑色丝袜高跟鞋| 免费不卡中文字幕在线| 三级a在线观看| 亚洲天堂精品视频| 国内精品久久久久久久久久久 | 亚洲一区二区三区免费看| 韩国女主播成人在线观看| 劲爆欧美第一页| 日韩av网址在线| 久久99久久久精品欧美| 一二三四中文字幕| 91麻豆高清视频| 91尤物国产福利在线观看| 欧美精品999| 国产一区日韩| 欧美激情国内自拍| 性感美女极品91精品| 九色在线观看视频| 91日韩在线播放| 亚洲在线观看| 日韩在线观看免| 日韩av最新在线观看| 91p九色成人| 成人免费在线网| 欧美精彩视频一区二区三区| 国产福利视频导航| 日本视频久久久| 欧美人成网站| 亚洲欧美va天堂人熟伦| 日韩一本二本av| 日韩中文影院| 天堂8在线天堂资源bt| 国产欧美精品一区二区三区四区| 国产人妻精品一区二区三| 97超碰蝌蚪网人人做人人爽| 天天天综合网| 插吧插吧综合网| 日韩免费看网站|