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

數據流中的中位數,確實輕敵了

開發 前端
問題也很簡單,也就是一組數據,找出它的中位數,然后有所不同的是這組數據可能會新增一些其他數據,也就是要我們自己維護這么一個數據結構去盡量高效的完成它。

[[408159]]

本文轉載自微信公眾號「bigsai」,作者大賽 。轉載本文請聯系bigsai公眾號。

 前言

大家好,我是bigsai,今天忙到爆炸(暫不透露以后透露),給大家分享一個巧妙的問題,五分鐘掌握。

今天在刷題時候,遇到一個hard問題,也是挺有意思,在劍指offer的第41題和力扣【數據流中的中位數】。

題目描述是這樣的:

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

例如,

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

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

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

void addNum(int num) - 從數據流中添加一個整數到數據結構中。

double findMedian() - 返回目前所有元素的中位數。

其實問題也很簡單,也就是一組數據,找出它的中位數,然后有所不同的是這組數據可能會新增一些其他數據,也就是要我們自己維護這么一個數據結構去盡量高效的完成它。

我打開這題力扣上的額描述,它好像就在誘惑我,告訴我什么!

然后我就以為真實的數據就在這個范圍,然后一頓操作猛如虎,一提交直接GG。不過這個問題是個非常好的問題,等到后面講,仔細先看看!

好了不多說了,我們進入正題,看看這個經典問題到底如何分析。

小白級別方法(無腦排序)

這個問題的解決老少皆宜,小白也有小白的方法,題不在難,能過就行(只對小白有效哇)。

一組數據存儲,我用數組、List都可以,而中位數,其實就是中間一個(偶數兩個均值)數,這個也好辦啊,排序啊!

一個ArrayList()海納百川(不定長數組可以存儲數據),一行Arrays.sort()走天下。用編程語言中已經存在的集合和API可以輕松實現!

分析一下這個算法的時間復雜度,每次插入時候需要排序 nlogn,查詢時間近O(1);次數多的話時間復雜度還是蠻高的。

具體代碼為:

  1. /** initialize your data structure here. */ 
  2. public MedianFinder() { 
  3.  
  4.  
  5. List<Integer>list=new ArrayList<>(); 
  6. public void addNum(int num) { 
  7.     list.add(num); 
  8.     list.sort(null); 
  9. public double findMedian() { 
  10.     if(list.size()%2==1) 
  11.         return list.get(list.size()/2); 
  12.     else { 
  13.         return (double) (list.get((list.size()-1)/2)+list.get(list.size()/2))/2; 
  14.     }  

一看結果,2000+ms,這也是一種極限了,這種方法僅限于小白,只為求過。

大白級別的方法(插入排序)

大白比小白稍微強一點,比較它大一點嘛,懂得多一點。

大白看到:這個序列剛開始沒有!然后一點一點在原有的基礎上增加長度,如果每次都打亂排序那代價有點高!所以能不能復用上次已經排好序的結果?

這不就插入排序嘛!

每次新來元素相當于插入排序的最后一步使他有序,然后在插入……

這個流程每次插入的時候由兩個部分組成,查找和移動,其中查找花費O(n),插入也是O(n)。時間復雜度依然是O(n)。

可以維護常數表示數據總個數,查找中位數時候可以直接根據數量查找,時間復雜度為O(1).這樣的時間復雜度在插入上優化為O(n)相比O(nlogn)有很大的提升。

但是聰明的大白還能發現一些閃光點,數組前面有序的,只是插入最后一個元素需要鎖定在有序順序結構中的位置,線性一個個查找太耗時了哇!這明顯就是一個二分應用的場景么!可以使用二分法找到插入的位置,然后插入。

二分+插入的時間復雜度是多少呢?

記住,不是O(logn),二分查找每一次的時間復雜度確實是O(logn),但插入操作的時間復雜度依舊是O(n),總的時間復雜度取最高量級 O(logn)+O(n)=O(n)。

所以這里以后如果遇到某個面試官問你:插入排序使用二分查找優化時間復雜度是多少?你一定要堅定的回答:是O(n2),從單詞操作來看,雖然查詢變為O(logn)但是插入依舊O(n),所以n個數時間復雜度依舊為O(n2)。

好了既然解釋清楚,一頓操作猛如虎,直接上代碼:

  1. class MedianFinder { 
  2.  
  3.     /** initialize your data structure here. */ 
  4.     public MedianFinder() { 
  5.  
  6.     } 
  7.     int arr[]=new int[50000]; 
  8.     int count=0; 
  9.     public void addNum(int num) { 
  10.         int low=0,high=count-1; 
  11.         while (low <= high) { 
  12.             int mid = (low + high) / 2; 
  13.             int midVal = arr[mid]; 
  14.  
  15.             if (midVal < num) 
  16.                 low = mid + 1; 
  17.             else if (midVal > num) 
  18.                 high = mid-1 ; 
  19.             else  
  20.                 low++; 
  21.         } 
  22.  
  23.         for(int i=count-1;i>=low;i--){ 
  24.             arr[i+1]=arr[i]; 
  25.         } 
  26.         arr[low]=num; 
  27.         count++; 
  28.     } 
  29.     public double findMedian() { 
  30.  
  31.         if(count%2==1) 
  32.             return arr[count/2]; 
  33.         else  
  34.             return (double) (arr[count/2-1]+arr[count/2])/2; 
  35.     } 

提交之后,200+ms,比起前面小白的無腦排序優化了很多,但只擊敗了10%用戶,說明方法還是不夠好,還是很白。

大佬的解法(雙堆/優先隊列)

這個問題的話其實也能想出來,但是確實除了這個問題沒見到兩個隊這么玩的,也算是打開眼界一回。

在前面,我們講過堆排序 和優先隊列的原理 ,里面詳細的講解了 堆這種數據結構,我們簡單回顧一下堆:

堆是一種完全二叉樹(即最后一層從左向右存在節點連續),因為是完全二叉樹我們經常用數組存儲,可以通過二叉樹下標轉換很好的鎖定位置進行交換。

堆分為大根堆和小根堆:

如果所有節點大于孩子節點值,那么這個堆叫做大根堆,堆的最大值在根節點。

如果所有節點小于孩子節點值,那么這個堆叫做小根堆,堆的最小值在根節點。

了解完這些基本解決這題就夠了,這里不需要知道堆、優先隊列的具體實現。但是堆和優先隊列,怎么應用到這個中位數查找呢?

這個就很巧妙了,我們將數據等半分到兩個堆中,其中一個是小根堆,一個是大根堆,小根堆存最大的一半數據,大的中最小的在堆頂;大根堆存最小的一半數據,小的中最大的在堆頂,中位數就只可能在兩個堆頂部分產生啦!

但是在具體實現過程中,也有很多需要注意的地方,再添加時候要先判斷和其中一個堆頂比較大小,應該加到哪一個堆(優先隊列)中,但是添加之后可能數值一直遞增很大或者數值一直遞減很小可能造成兩個堆元素數量不平衡,那么就要將其中少的加到多的中。

這里我在實現的時候約束小根堆的元素個數等于大根堆個數(偶數)或者等于大根堆個數加一(奇數),在奇數情況就直接取小根堆頂返回即可。因為Java已經實現優先隊列,你不需要詳細實現其中細節(大佬可以試試參考以前我寫的優先隊列實現)。

分析這個時間復雜度,每個堆插入、刪除的時間復雜度級別是O(log n/2),即使如果面臨元素平衡可能多操作兩次,但是時間復雜度還是O(logn)級別。比起O(n)快了不少,數據量越大體現越明顯。

具體代碼為:

  1. class MedianFinder { 
  2.  
  3.     /** initialize your data structure here. */ 
  4.     public MedianFinder() { 
  5.  
  6.     } 
  7.     Queue<Integer>q1=new PriorityQueue<>();//小根堆 放大的數據 
  8.     //大根堆 
  9.     Queue<Integer>q2=new PriorityQueue<>(new Comparator<Integer>() { 
  10.         @Override 
  11.         public int compare(Integer o1, Integer o2) { 
  12.             return o2-o1; 
  13.         } 
  14.     }); 
  15.     public void addNum(int num) { 
  16.        if(q1.isEmpty()) 
  17.             q1.add(num); 
  18.         else if(num>q1.peek()){//插入到小根堆 
  19.             q1.add(num); 
  20.            if (q1.size()>q2.size()+1){ 
  21.               q2.add(q1.poll()); 
  22.             } 
  23.         } 
  24.         else{//插入到大根堆 
  25.             q2.add(num); 
  26.             if (q2.size()>q1.size()){ 
  27.             q1.add(q2.poll()); 
  28.             } 
  29.         } 
  30.  
  31.     } 
  32.     public double findMedian() { 
  33.         if(q1.size()==q2.size()) 
  34.             return (double)(q1.peek()+q2.peek())/2; 
  35.         else  
  36.             return q1.peek(); 
  37.     } 

執行區間75ms,比起上一個大白又好很多,這個雙堆,真的太妙了!我也是第一次見。

提升

對于這個問題,還有一些妖魔鬼怪用二叉搜索樹來做,理論上也是可行的,插入效率不一定很穩定,查詢效率比較低(二叉樹的中序排序)。

但是文初提到的場景問題還是要仔細思考一下,面試場景很可能會問到:

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

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

對于第一個問題,應該用什么方法優化呢?

如果還是采用傳統的雙堆,如果數據量非常大的情況下,效率肯定還是有優化空間,當數據比較集中分布的時候,肯定要考慮計數排序啊!

如果數據分布在0-100之間,可以直接開一個101大小的數組,遇到一個數就將其對應位置值加一,不光0-100 可以這樣,在某個范圍內都可以通過移動表示。

然后你找到中位數,只需要枚舉疊加找到中間位置的數啦。

不過你可以再進行優化,將這個計數排序修改一下,用數組值表示小于當前位置值的個數。這樣這個數組值是連續遞增的,查找的時候還可以使用二分優化。

不過具體實現上,可能還有一些你需要考慮的,分析算法復雜度,每次插入操作,對應小標以及之后值都要加一,所以操作次數不超過50,而查詢操作使用二分法也不超過10次,所以在數據比較集中 數據個數很多有大量重復情況,使用計數排序是非常好的。

另外,如果99%在0-100范圍內也很容易哇,就是在前后邊緣特意設置0和102,超過100的放到102號,小于0的放到0位置,剩下每次來x放x+1位置,因為中位數肯定出現在0-100所以這個依舊可行!

 

責任編輯:武曉燕 來源: bigsai
相關推薦

2021-10-27 10:43:36

數據流中位數偶數

2011-04-14 14:43:38

SSISTransformat

2011-12-14 15:57:13

javanio

2009-07-15 09:06:11

Linux圖形系統X11的CS架構

2011-04-19 09:18:02

SSIS數據轉換

2020-02-06 19:12:36

Java函數式編程編程語言

2016-11-14 19:01:36

數據流聊天系統web

2009-08-19 10:41:12

Java輸入數據流

2022-03-18 08:57:17

前端數據流選型

2017-11-16 19:26:34

海量數據算法計算機

2024-04-18 09:02:11

數據流Mixtral混合模型

2012-07-30 08:31:08

Storm數據流

2019-12-19 14:38:08

Flink SQL數據流Join

2013-10-21 10:58:50

微軟大數據SQL Server

2014-02-11 08:51:15

亞馬遜PaaSAppStream

2014-12-02 10:56:47

TCPIP交互數據流

2020-08-20 11:24:31

物聯網數據技術

2023-08-31 16:47:05

反應式編程數據流

2023-03-17 07:39:54

開源數據流技術

2010-04-30 09:53:34

Unix系統
點贊
收藏

51CTO技術棧公眾號

尤蜜粉嫩av国产一区二区三区| 国产精品久久国产精品| 国产精品1区2区3区4区| 国产日韩一区二区三免费高清| 亚洲青青青在线视频| 国产主播一区二区三区四区| 无码视频在线观看| 伊人久久大香线| 精品视频在线播放色网色视频| 北条麻妃视频在线| 先锋影音在线资源站91| 久久婷婷色综合| 亚洲自拍在线观看| 看黄色一级大片| 欧美午夜不卡影院在线观看完整版免费| 日韩电影在线观看中文字幕| 午夜剧场高清版免费观看| 91超碰在线| 一色桃子久久精品亚洲| 裸模一区二区三区免费| 国产哺乳奶水91在线播放| 丝袜亚洲另类欧美| 97精品国产97久久久久久免费| 成人精品一二三区| 欧美人与物videos另类xxxxx| 777午夜精品免费视频| 国产日韩成人内射视频 | 国产亚洲欧洲高清一区| 无码人妻丰满熟妇区毛片蜜桃精品| 日韩av中字| 午夜精品成人在线视频| 久久av高潮av| 激情影院在线观看| 亚洲国产高清在线| 欧美日韩一区二区三| 日韩一级片免费观看| 国精产品一区一区三区mba桃花| 国产成人一区二区三区| 日韩黄色在线视频| 亚洲天堂偷拍| 欧美疯狂xxxx大交乱88av| 欧美性生交大片| 日韩欧美一区二区三区免费看| 亚洲片av在线| 亚洲综合色一区| 偷拍一区二区| 亚洲美女视频网站| 少妇饥渴放荡91麻豆| 欧美变态挠脚心| 亚洲成人激情视频| 99久久人妻精品免费二区| 大奶在线精品| 日韩www在线| 最新在线黄色网址| 久久久伦理片| 精品视频在线播放| 国产jk精品白丝av在线观看| 久久99国产精品视频| 亚洲美女av黄| 99精品全国免费观看| 成人在线丰满少妇av| 中文一区二区视频| 国产精品麻豆一区| 中文精品久久| 国产做受69高潮| 久久青青草视频| 久久最新视频| 成人免费淫片视频软件| 国产女18毛片多18精品| 国产成人精品一区二区三区四区 | 中文字幕 91| 午夜精品久久久久久毛片| 91精品国产品国语在线不卡| 一二三区视频在线观看| 欧美激情极品| 国产一区二区成人| 黄色录像二级片| 黄色日韩在线| 日韩av色在线| 国产免费高清视频| 99久久婷婷国产| 日韩欧美精品久久| 大片免费在线看视频| 亚洲成人综合视频| chinese少妇国语对白| 成人国产精品一区二区网站| 精品国产一区二区三区不卡| 亚洲av无码一区二区二三区| 首页国产精品| 97视频com| 亚洲视频久久久| 成人免费观看男女羞羞视频| 日韩av一区二区三区在线| 免费观看久久久久| 激情懂色av一区av二区av| 色悠悠久久综合网| 久久亚州av| 精品国产拍在线观看| 国产视频91在线| 美国毛片一区二区| 久久久久久高清| av片在线观看网站| 91福利视频网站| 99riav国产精品视频| 成人3d动漫在线观看| 午夜欧美不卡精品aaaaa| 在线观看国产小视频| 成人国产免费视频| 一本—道久久a久久精品蜜桃| 日本不卡免费高清视频在线| 欧美一级二级三级乱码| av黄色在线免费观看| 亚洲韩日在线| 51国偷自产一区二区三区的来源 | 台湾色综合娱乐中文网| 日韩专区在线观看| 久久久久久不卡| 成人a免费在线看| 在线观看成人免费| 韩国成人在线| 日韩电影中文字幕一区| 国产在线综合网| 黄色资源网久久资源365| 六月婷婷久久| 阿v视频在线观看| 欧美成人欧美edvon| 免费高清在线观看电视| 免费不卡在线观看| 欧美主播一区二区三区美女 久久精品人 | 欧美成人激情在线| 91免费视频播放| 中文字幕二三区不卡| 国产女女做受ⅹxx高潮| 欧美亚洲tv| 国内外成人免费激情在线视频网站 | 精品国产福利| missav|免费高清av在线看| 欧美一区日本一区韩国一区| 91香蕉一区二区三区在线观看| 日韩国产精品久久久久久亚洲| 久久精品人成| 天堂а√在线最新版中文在线| 亚洲电影免费观看高清完整版在线| 欧产日产国产v| 国产乱妇无码大片在线观看| 资源网第一页久久久| 午夜不卡一区| 久色乳综合思思在线视频| 国产日韩欧美中文字幕| 亚洲天堂精品视频| www.久久com| 欧美日韩亚洲一区三区| 国产精品sss| 2020日本在线视频中文字幕| 亚洲精品久久7777777| 日韩三级视频在线| 91伊人久久大香线蕉| 少妇高潮喷水久久久久久久久久| 西野翔中文久久精品国产| 欧美一级淫片aaaaaaa视频| 久久电影视频| 欧美三级中文字幕| 久久精品一区二区三区四区五区 | 亚洲xxxxxx| 91精品国产乱码久久蜜臀| 久久久久亚洲av成人片| 91网站在线观看视频| 欧美在线观看视频网站| 91久久国产| 成人av片网址| 婷婷六月国产精品久久不卡| 中文字幕v亚洲ⅴv天堂 | 国产视频自拍一区| 在线观看亚洲一区二区| 亚洲男人的天堂一区二区| yjizz视频| 日日夜夜精品视频天天综合网| 日韩欧美精品一区二区| 国产麻豆一区二区三区| 午夜精品一区二区三区在线播放| 高清av在线| 日韩午夜电影在线观看| 免费观看成人毛片| 亚洲天堂2016| 中国极品少妇videossexhd| 日韩高清不卡在线| 亚洲国产精品女人| 日本国产精品| 91欧美日韩一区| 中文在线最新版地址| 日韩视频免费在线观看| 免费国产羞羞网站视频| 欧美三级日韩在线| 日韩免费一二三区| 国产精品视频一二三| 熟女人妻一区二区三区免费看| 噜噜噜在线观看免费视频日韩| 综合一区中文字幕| 日韩高清在线免费观看| 91精品免费久久久久久久久| 日本三级一区| 欧美成人国产va精品日本一级| 黄色网址在线播放| 精品久久99ma| 一卡二卡三卡在线观看| 精品久久久久久亚洲国产300| 熟女少妇a性色生活片毛片| 久久美女艺术照精彩视频福利播放| 992kp免费看片| 久久精品动漫| 欧美视频免费看欧美视频| 婷婷久久国产对白刺激五月99| 久久综合婷婷综合| 国产成人福利av| 91视频免费进入| 涩涩涩久久久成人精品| 国产国语刺激对白av不卡| ****av在线网毛片| 欧美精品999| 黄网站免费在线播放| 中文字幕综合一区| 免费在线黄色影片| 日韩www在线| 人人妻人人澡人人爽久久av| 日韩一级免费观看| 国产美女裸体无遮挡免费视频| 欧美无乱码久久久免费午夜一区| a v视频在线观看| 亚洲妇女屁股眼交7| 日韩一级片大全| 中文字幕一区av| jizz18女人高潮| 国产欧美精品一区aⅴ影院 | av天堂永久资源网| 雨宫琴音一区二区在线| 乱熟女高潮一区二区在线| 亚洲色图网站| 欧美 国产 精品| 亚洲v在线看| 精品国产一区二区三区在线| 一区二区三区中文| 一二三在线视频| 中文字幕一区二区三三 | 国产精品普通话对白| 国产无限制自拍| 99精品视频免费| 国模无码视频一区二区三区| 亚洲精选91| 亚洲中文字幕无码不卡电影| 久久精品国产清高在天天线| 日韩人妻精品无码一区二区三区| 在线亚洲自拍| 日韩有码免费视频| 另类成人小视频在线| 久久久久久久久久一区| 国产美女精品人人做人人爽| 亚洲AV无码久久精品国产一区| 国产成人免费xxxxxxxx| 小毛片在线观看| 久久综合国产精品| a天堂中文字幕| 中文字幕中文字幕在线一区| 曰本女人与公拘交酡| 亚洲18女电影在线观看| 日日噜噜噜噜人人爽亚洲精品| 在线日韩国产精品| 国产精品久久久久久久成人午夜| 91精品国产福利在线观看| 黄色美女一级片| 亚洲美女av网站| 免费黄网站在线| 国内精品久久久久久影视8| 一区二区三区短视频| 国产精品久久久久久久午夜| 国产视频一区二区在线播放| 国产日韩欧美一区二区三区四区| 国产成人调教视频在线观看| 一道精品一区二区三区| 欧美人成在线| 免费大片在线观看| 国产原创一区二区| 懂色av粉嫩av蜜乳av| 国产精品麻豆一区二区| 伊人国产在线观看| 欧美在线观看禁18| 午夜老司机福利| 一区二区在线免费视频| 色a资源在线| 国产精品 欧美在线| 亚洲一区二区三区四区电影| 欧美日韩亚洲在线| 欧美视频导航| 五月天婷婷激情视频| 国产成人精品免费| 97人妻人人揉人人躁人人| 亚洲曰韩产成在线| a片在线免费观看| 亚洲成avwww人| 色网站在线看| 日韩av三级在线观看| eeuss国产一区二区三区四区| 日本一区二区在线| 亚洲性人人天天夜夜摸| 亚洲精品自拍网| 91麻豆视频网站| 午夜写真片福利电影网| 欧美在线小视频| 午夜性色福利视频| 久久国产精品久久久久| 欧美不卡高清一区二区三区| 国产精品一区二区欧美| 国产精品毛片一区二区在线看| 久久久噜噜噜www成人网| 国产激情精品久久久第一区二区 | 亚洲电影一区二区三区| 97国产精品久久久| 一区二区三区黄色| 欧美xoxoxo| 精品亚洲欧美日韩| 国产综合视频| 午夜剧场高清版免费观看| 久久美女高清视频| 波多野结衣国产| 亚洲成人免费网站| 男插女视频久久久| 亚洲综合中文字幕68页| 97视频热人人精品免费| av五月天在线| 久久精品视频一区二区| 青青青国产在线| 亚洲精品久久久久中文字幕二区| 日本aa在线| av资源站久久亚洲| 在线中文一区| 在线免费黄色小视频| 中文字幕亚洲电影| 一级黄色片在线| 色偷偷888欧美精品久久久 | 在线亚洲观看| 国产国语性生话播放| 懂色av影视一区二区三区| 香蕉视频免费看| 2019精品视频| 日韩理论电影中文字幕| 99精品人妻少妇一区二区| 99久久久久久| 91精品国产综合久久久蜜臀九色| 亚洲高清不卡av| 九色porny丨国产首页在线| 精品国产一二| 久久午夜视频| 欧美做受高潮6| 欧美午夜精品久久久| 137大胆人体在线观看| 成人激情视频在线播放| 91精品国产91久久综合| 四虎国产精品免费| 亚洲国产一区二区在线播放| 免费国产精品视频| 欧美一区二区影院| 青青草97国产精品麻豆| 奇米视频7777| 亚洲五码中文字幕| 青青青手机在线视频观看| 国产精品精品久久久| 91精品高清| 制服丝袜第二页| 欧美日韩在线直播| 欧美卡一卡二| 青娱乐一区二区| 极品美女销魂一区二区三区 | 夜级特黄日本大片_在线| 亚洲综合精品伊人久久| 一本色道精品久久一区二区三区| 亚洲精品成人无码熟妇在线| 欧美写真视频网站| 91麻豆一二三四在线| 精品中文字幕一区| 美女网站色91| 国产成人精品亚洲男人的天堂| 亚洲欧洲在线视频| 日韩中文在线| 精品久久久久久无码国产| 亚洲国产精品t66y| 亚洲av无码乱码国产麻豆| 国产成人aa精品一区在线播放| 91超碰成人| 国产精品密蕾丝袜| 日韩欧美国产高清| 欧美电影免费观看| 伊人久久在线观看| 久久九九久久九九| 成人黄色免费视频| 国产精品第一第二| 在线精品一区二区| 欧美美女性生活视频| 日韩黄色av网站| 久久综合给合| 丁香婷婷激情网| 亚洲一级在线观看|