国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據流中的中位數

2019-11-08 02:46:23
字體:
來源:轉載
供稿:網友

題目描述

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

算法解析: 首先我們最先想到的就是如果我們利用數組來作為數據容器,將數組排序后,十分簡便就可以獲得中位數,但這里是數據流,我們不可能在數據流中使用直接將數據放入數據容器,在取出的時候將整個數據容器排序,再取出中位數,所以如果我們將排序再度簡化,即如果有一個數組,前一半都比后一半小,那么如果數據總數是奇數的時候,我們只需要取出前一半中最大的數即可,如果是偶數我們只需要取出前一半的最大值和后一半的最小值,取其平均值即可。 這里我們選用最大堆和最小堆來實現,最大堆用于保存前一半,最小堆用于保存后一半,下面分析如何插入數據:

如果兩個堆的數據總數相同,即數據流數據總數是偶數,這里我們將數據插入最大堆。 如果插入的數字不全小于最小堆中的數,由于需要保持最小堆中的所有值大于最大堆中的所有值,所以我們將最小堆中的最小值放到最大堆,并且將插入值放入最小堆。直接放入最大堆。如果兩個堆的數據總數不同,即數據流數據總數是奇數,這里我們將數據插入最小堆。 如果插入的數字不全大于最大堆中的數,由于需要保持最小堆中的所有值大于最大堆中的所有值,所以我們將最大堆中的最大值放到最小堆,并且將插入值放入最大堆。直接放入最小堆。

代碼如下:

Comparator<Integer> comparator = new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o2.compareTo(o1); } }; PRiorityQueue<Integer> maxHeap = new PriorityQueue<>(20, comparator); PriorityQueue<Integer> minHeap = new PriorityQueue<>(20); public void Insert(Integer num) { if (maxHeap.size() == minHeap.size()) { if (minHeap.peek() != null && num > minHeap.peek()) { maxHeap.offer(minHeap.poll()); minHeap.offer(num); } else { maxHeap.offer(num); } } else { if (num < maxHeap.peek()) { minHeap.offer(maxHeap.poll()); maxHeap.offer(num); } else { minHeap.offer(num); } } } public Double GetMedian() { if (maxHeap.isEmpty()) { return -1d; } if (maxHeap.size() == minHeap.size()) { return (double) (minHeap.peek() + maxHeap.peek()) / 2; } else { return (double) maxHeap.peek(); } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安仁县| 宝山区| 吴桥县| 中超| 凌源市| 肇源县| 阜阳市| 鱼台县| 临汾市| 陆川县| 杂多县| 济阳县| 都江堰市| 石景山区| 象山县| 临海市| 利津县| 竹北市| 台东市| 宿迁市| 昭通市| 木兰县| 澄迈县| 乐亭县| 昌邑市| 丰顺县| 绿春县| 乐山市| 定日县| 辽阳市| 高淳县| 宁蒗| 德钦县| 敦煌市| 防城港市| 耒阳市| 聂荣县| 噶尔县| 德阳市| 墨竹工卡县| 深水埗区|