多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > 數據流中的中位數

數據流中的中位數

來源:程序員人生   發布時間:2016-07-13 08:51:20 閱讀次數:2408次

題目

如何得到1個數據流中的中位數?如果從數據流中讀出奇數個數值,那末中位數就是所有數值排序以后位于中間的數值。如果從數據流中讀出偶數個數值,那末中位數就是所有數值排序以后中間兩個數的平均值。

解題

劍指offer上說的很詳細
1.無序數組
插入:O(1)
獲得中位數:O(N)

import java.util.*; public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public void Insert(Integer num) { list.add(num); } public Double GetMedian() { int size = list.size(); Collections.sort(list); if(size%2==1){ return 1.0*list.get(size/2); }else{ return (list.get(size/2) + list.get(size/2-1))/2.0; } } }

2.有序數組
插入:O(N)
獲得中位數:O(1)

import java.util.*; public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public void Insert(Integer num) { int i =0; while(i<list.size()){ if(list.get(i)<=num){ i++; }else break; } list.add(-1); int j = list.size() -1; while(j>i){ list.set(j,list.get(j-1)); j--; } list.set(i,num); } public Double GetMedian() { int size = list.size(); if(size%2==1){ return 1.0*list.get(size/2); }else{ return (list.get(size/2) + list.get(size/2-1))/2.0; } } }

3.有序鏈表
插入:O(N)
獲得中位數:O(N)

import java.util.*; public class Solution { LinkedList<Integer> list = new LinkedList<Integer>(); public void Insert(Integer num) { if(list.size() < 1){ list.add(num); return; } int i = 0; while(i<list.size()){ if(list.get(i) <=num) i++; else break; } list.add(i,num); } public Double GetMedian() { if( list.size() < 1 ) return null; if((list.size()&1) == 1){ return list.get(list.size()/2)+0.0; }else{ return (list.get((list.size()-1)/2)+list.get(list.size()/2)+0.0)/2; } } }

LinkedList內部實現就是鏈表,這里獲得中位數是需要1個1個的遍歷鏈表的
劍指offer書上定義兩個指針指向兩邊中間,太復雜,省略了

4.最大堆,最小堆
插入:O(log(n))
獲得中位數:O(1)
兩個堆數據之差不超過1
抄的程序
優先隊列,可以模型堆嗎?

import java.util.*; import java.util.Comparator; import java.util.PriorityQueue; public class Solution { int count = 0; private PriorityQueue<Integer> minHeap = new PriorityQueue<>(11, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); private PriorityQueue<Integer> maxHeap = new PriorityQueue<>(11, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); public void Insert(Integer num) { count++; if (count % 2 == 0) { maxHeap.offer(num); int i = maxHeap.poll(); minHeap.offer(i); } else { minHeap.offer(num); int i = minHeap.poll(); maxHeap.offer(i); } } public Double GetMedian() { if (count % 2 == 0) { return (Double.valueOf(maxHeap.peek()) +Double.valueOf( minHeap.peek())) / 2; } else { return Double.valueOf(maxHeap.peek()); } } }

也能夠這樣理解,兩個數組,AB,A內的元素都比B的小,B內的元素都比B的大,A是升序的,B也是升序的
中位數就是A的最大值和B的最小值的平均值
插入元素時候,上面程序是根據插入數據的奇數偶數順序選擇插入到對應的AB中,這樣很好
奇數時候插入到A,A最大值插入到B
偶數時候插入到B,B最小值插入到A
可以用兩個排序數組

其他樹實現的太復雜了,省略了

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 性猛交xxxxx按摩欧美 | 最近的中文字幕免费完整 | freexxx性亚洲xxxx | 亚洲最新在线观看 | 特级淫片aaaaa片毛片 | 欧美另类老人xxxx | 日本亚洲网站 | 亚洲精品午夜久久aaa级久久久 | 纯欧美一级毛片免费 | 成人久久久精品乱码一区二区三区 | 国产女人成人精品视频 | 人喾交性专区免费 | 另类图片成人偷拍 | 狠狠干天天色 | 久久优| 日本另类图片 | 性做久久久久久网站 | 中文日韩欧美 | 大陆三级午夜理伦三级三 | 亚洲伊人久久大香线蕉啊 | 亚欧人成精品免费观看 | 精品偷自拍另类在线观看 | 欧美精品1区2区 | 国产毛片片精品天天看视频 | 自拍偷拍图区 | 欧美成人h版影片在线观看 欧美成人h版影院在线播放 | 国产精品免费小视频 | 久久国产区 | 亚洲a视频在线观看 | 亚洲伊人久久大香线蕉苏妲己 | 日韩大片免费观看 | 国产三级自拍视频 | 欧美日韩另类综合 | 日本一级毛片在线观看 | 国产在线精品一区二区夜色 | 一区二区三区视频在线观看 | 日本天堂在线播放 | 亚洲网站免费 | 亚洲天堂成人在线 | 国产精品一区二区三区四区五区 | 欧美成人久久久免费播放 |