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

国模娜娜一区二区三区| 北条麻妃在线一区二区免费播放 | 91麻豆精品秘密| 久久免费成人精品视频| 精品人妻一区二区免费视频| 黄色av网址在线| 亚洲视频播放| 中文字幕日韩电影| 一级黄色在线播放| av老司机免费在线| 久久久久99精品一区| 国产有码一区二区| 免费三级在线观看| 国产在线播放精品| 在线观看av一区二区| 久久免费视频2| 少妇高潮一区二区三区99小说| 亚洲永久免费精品| 在线视频欧美性高潮| 亚洲在线观看网站| 一区二区三区电影大全| 国产精品午夜久久| 国产精品一区二区欧美黑人喷潮水| 日韩欧美中文字幕一区二区| 久久精品国产大片免费观看| 欧美一级xxx| 任你操这里只有精品| 久久综合网导航| 不卡的av在线播放| 国产伦精品一区二区三区精品视频| 欧美黄色免费看| 日韩中文首页| 中文字幕亚洲无线码在线一区| 又黄又爽的网站| 99久久香蕉| 欧美久久一区二区| 一个色综合久久| 在线成人视屏| 欧洲精品一区二区| 欧美色图色综合| 九色porny丨国产首页在线| 一区二区三区四区精品在线视频 | 香港三日本8a三级少妇三级99| 95精品视频| 欧美另类变人与禽xxxxx| 人妻丰满熟妇av无码区app| 人狥杂交一区欧美二区| 亚洲成av人片一区二区三区| 免费的一级黄色片| caopo在线| 亚洲人成影院在线观看| 日韩视频在线观看视频| 欧美成人二区| 亚洲免费伊人电影| 天天想你在线观看完整版电影免费| 精品国产丝袜高跟鞋| 中文字幕在线观看一区| 国产又爽又黄ai换脸| 成人黄色网址| 亚洲精品国产第一综合99久久| 日韩人妻一区二区三区蜜桃视频| 成人欧美在线| 亚洲一区二区高清| 怡红院av亚洲一区二区三区h| 国产h片在线观看| 一本色道久久综合亚洲精品按摩| 超碰av在线免费观看| 777午夜精品电影免费看| 欧美日韩色综合| 涩多多在线观看| 99a精品视频在线观看| 亚洲成人精品视频在线观看| 国产一级二级在线观看| 精品国产不卡| 欧美久久久精品| 91久久国产视频| 日韩电影在线免费看| 成人午夜高潮视频| 蜜臀av在线观看| 国产喂奶挤奶一区二区三区| 亚洲在线色站| 久草在线新免费首页资源站| 欧美日韩国产精品一区二区三区四区| 北条麻妃在线视频| 九色精品蝌蚪| 日韩毛片在线观看| 欧美xxxx精品| 在线观看一区| 国产美女精品视频| 少妇又色又爽又黄的视频| 国产欧美一区二区精品性色超碰 | 午夜理伦三级做爰电影| 四季av在线一区二区三区| 欧美黑人xxxx| 五月天中文字幕| 粉嫩蜜臀av国产精品网站| 久久国产精品99久久久久久丝袜| 日本中文字幕电影在线免费观看| 亚洲国产日韩a在线播放性色| 超碰在线人人爱| 国产suv精品一区二区四区视频| 一区国产精品视频| 亚洲一区 视频| 久久www免费人成看片高清| 国产精品露出视频| 日本高清中文字幕在线| 亚洲 欧美综合在线网络| 天堂在线资源视频| 亚洲盗摄视频| 欧美黑人极品猛少妇色xxxxx| 最好看的日本字幕mv视频大全| 成人性生交大片免费看视频在线| 婷婷亚洲婷婷综合色香五月| av在线视屏| 欧美一卡二卡三卡四卡| 又色又爽的视频| 午夜宅男久久久| 国产精品日韩一区二区三区 | 日本三级韩国三级久久| 亚洲欧美国产高清va在线播放| 国产精品久久久久久户外露出| 日本欧美黄色片| 911精品国产| 精品国产一区二区三区久久久狼 | 久久婷婷丁香| 久久人人九九| heyzo在线播放| 日韩一区二区在线看| 天堂а√在线中文在线鲁大师| 亚洲女人av| 久久综合九九| 女人高潮被爽到呻吟在线观看 | 国产无套精品一区二区三区| 日韩欧美精品综合| 国产精品美乳一区二区免费| 可以在线观看的黄色| 亚洲电影一区二区| 黄色av电影网站| 欧美色图首页| 亚洲一区制服诱惑| av小次郎在线| 91精品午夜视频| 性色国产成人久久久精品| 蜜臀av亚洲一区中文字幕| 亚洲欧美日韩精品在线| 懂色aⅴ精品一区二区三区| 正在播放欧美视频| 一级全黄裸体免费视频| 中文字幕制服丝袜成人av| 午夜剧场高清版免费观看| 日本不卡免费一区| 国产欧美va欧美va香蕉在线| 毛片在线视频| 日韩亚洲欧美成人一区| 精品一区在线视频| 91丨九色丨蝌蚪富婆spa| 亚洲精品无码久久久久久| 亚洲国产欧美日韩在线观看第一区 | 国产精品一 二 三| av影院在线免费观看| 亚洲乱码国产乱码精品精天堂| 波多野结衣一区二区在线| 国产色一区二区| 天天操狠狠操夜夜操| 亚洲精品国产首次亮相| 91九色蝌蚪成人| 国产精品yjizz视频网| 亚洲精品一区中文| 中文字幕久久久久| 亚洲精品一二三区| 三级男人添奶爽爽爽视频| 久久久国产亚洲精品| 亚洲精品一区二区三| 国产亚洲高清一区| 亚洲2020天天堂在线观看| 国产免费a∨片在线观看不卡| 欧美日韩国产高清一区二区三区 | 夜夜嗨一区二区| 日本三级中国三级99人妇网站| 欧美成人毛片| 久久久久久网站| 福利在线午夜| 精品国产一区二区三区久久影院 | 91精品国产一区二区| 日韩成人免费在线观看| 国产日韩视频一区二区三区| 国产资源中文字幕| 久久国产一二区| 蜜臀在线免费观看| 久久99国产成人小视频| 亚洲free性xxxx护士hd| 国产精品一区二区av影院萌芽| 日韩网站免费观看高清| 日本黄色免费视频| 欧美精品第一页| 国产www在线| 亚洲欧美日本韩国| 欧美偷拍一区二区三区| 岛国一区二区在线观看| 波多野结衣国产精品| 亚洲精品在线二区| 91制片厂免费观看| 精品久久久久久久久久久下田| 成人区精品一区二区| 成人一区视频| 欧美资源在线观看| 欧美人动性xxxxz0oz| 日韩中文字幕精品| 欧美男男同志| 亚洲黄色免费三级| 国产99999| 欧美精品久久天天躁| 成人免费毛片视频| 精品国产户外野外| 国产这里有精品| 中文字幕一区二区三区在线观看 | 亚洲综合色成人| 国产免费一区二区三区四区| 久久精品一区四区| 人妻在线日韩免费视频| 丰满白嫩尤物一区二区| 亚洲自拍第三页| 极品尤物av久久免费看| 我要看一级黄色大片| 日韩精品午夜视频| 欧美视频第三页| 噜噜噜91成人网| 日韩毛片在线免费看| 99热这里只有精品8| 国产精彩视频一区二区| 亚洲无线一线二线三线区别av| 经典三级在线视频| 91精品天堂福利在线观看| 一区二区免费在线视频| 日韩av免费大片| 伊人久久大香线蕉av一区| 国产九一精品| 污视频在线免费观看一区二区三区| 亚洲成a人片77777在线播放| 精品在线一区| 久久99视频| 日本视频精品一区| 日韩啪啪电影网| 伊人久久大香线蕉成人综合网| 久久一区91| 亚洲成人动漫在线| 欧美日韩1区2区3区| 欧美亚洲黄色片| 一本色道久久综合亚洲精品不| 天天夜碰日日摸日日澡性色av| 国产美女一区| 男人女人黄一级| 喷水一区二区三区| 午夜啪啪小视频| 国产91在线看| 久久久久成人精品无码中文字幕| 91在线国产福利| 天堂在线中文视频| 亚洲品质自拍视频| 久久精品美女视频| 欧美日韩中文在线| 波多野结衣毛片| 欧美一级日韩一级| 欧美一级特黄aaaaaa大片在线观看| 亚洲国产天堂久久综合网| 日本天堂在线| www.色综合| 懂色av一区| 国产成人精品电影| 精品国产不卡一区二区| 国产综合18久久久久久| 精品免费一区二区| 中国一级黄色录像| 国产九九精品| 三级一区二区三区| jizz一区二区| 影音先锋男人看片资源| 亚洲综合一二区| 波多野结衣电车痴汉| 日韩一区二区免费高清| 天天在线女人的天堂视频| 在线精品国产成人综合| 欧美1234区| 国产精品视频在线播放| 91成人午夜| 亚洲欧美久久234| 亚洲精品免费观看| 99九九99九九九99九他书对| 成人sese在线| 顶级黑人搡bbw搡bbbb搡| 午夜欧美大尺度福利影院在线看| 亚洲视屏在线观看| 亚洲成人aaa| 麻豆系列在线观看| 情事1991在线| 中文字幕一区二区三区四区久久 | 欧美精品国产| 欧美在线观看视频网站| 丁香六月综合激情| 四虎永久免费地址| 一本大道久久精品懂色aⅴ| xxxx国产精品| 最近2019年好看中文字幕视频 | 欧美日韩中文一区| 五月天婷婷在线播放| 美女久久久久久久久久久| 日韩和的一区二在线| 国产免费一区二区| 最新国产精品久久久| 亚洲欧美自拍另类日韩| 91视频国产观看| 久久久久免费看| 91精品国产91热久久久做人人| 黄网在线免费| 欧美亚洲另类在线| 免费福利视频一区| 18禁裸男晨勃露j毛免费观看 | 99久久免费看精品国产一区| 亚洲青青青在线视频| 在线亚洲欧美日韩| 亚洲最大中文字幕| 视频在线日韩| 久久综合色一本| 国产日韩亚洲| 黄色片视频免费观看| 偷拍一区二区三区四区| 亚洲av少妇一区二区在线观看| 久久久精品2019中文字幕神马| 国产成人精品一区二区三区视频| 欧美日韩精品免费观看视一区二区| 亚洲区国产区| 一女三黑人理论片在线| 午夜精品一区在线观看| 免费看av毛片| 国语自产精品视频在线看抢先版图片| 91蝌蚪精品视频| 国产免费裸体视频| 风间由美性色一区二区三区| 久久免费播放视频| 精品欧美乱码久久久久久 | 五月婷婷欧美视频| 国模无码一区二区三区| 久久久久女教师免费一区| 成人av动漫| 国产精品又粗又长| 91免费视频观看| 久久久久久在线观看| 亚洲视频欧美视频| 欧美黄页免费| 99热这里只有精品免费| 国产.精品.日韩.另类.中文.在线.播放 | 免费观看不卡av| 欧美激情成人网| 国产精品久久久一本精品| 97精品人妻一区二区三区| 久热国产精品视频| 亚洲国产欧美在线观看| 国产69精品久久久久999小说| 97精品电影院| 无码视频在线观看| 日日狠狠久久偷偷四色综合免费| 成人在线精品| 免费看黄在线看| 久久人人爽爽爽人久久久| 中文字幕免费高清在线观看| 久久久成人精品视频| 国产 日韩 欧美 综合 一区| 欧美视频第一区| 国产精品久久久久久久久免费相片| 国产农村妇女毛片精品| 久久久久久网址| 欧美日韩精品一区二区视频| 国产资源中文字幕| 欧美日韩一区二区免费在线观看| 97电影在线观看| 成人黄动漫网站免费| 小嫩嫩精品导航| 久久精品日韩无码| 亚洲精品成人久久久| 91超碰碰碰碰久久久久久综合| 久久久天堂国产精品| 26uuu成人网一区二区三区| 国产又粗又猛又黄又爽无遮挡| 欧美日本中文字幕| 国产不卡av一区二区| 超碰91在线播放| 在线看一区二区| bl在线肉h视频大尺度| 少妇特黄a一区二区三区| 国产精品888| 欧美 亚洲 另类 激情 另类| 欧美黄色性视频| 日韩中字在线| 国产 xxxx| 日韩一区二区中文字幕| 91国内外精品自在线播放| 日韩av高清在线看片| 最近日韩中文字幕| 国产日本在线观看| 国内精品**久久毛片app|