国产探花免费观看_亚洲丰满少妇自慰呻吟_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(); } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 建昌县| 太和县| 淮滨县| 紫金县| 临夏县| 宣威市| 黔江区| 凤阳县| 南雄市| 长乐市| 崇左市| 克什克腾旗| 永寿县| 丹凤县| 夹江县| 新津县| 孙吴县| 镇原县| 枣强县| 九寨沟县| 屯昌县| 锦屏县| 邛崃市| 公主岭市| 革吉县| 灵石县| 永福县| 华坪县| 嘉峪关市| 尚志市| 微博| 诸暨市| 抚顺县| 朔州市| 行唐县| 荥经县| 金阳县| 台前县| 镇平县| 平潭县| 论坛|