Python实现数据流中的中位数【堆】

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。

这一题的思路主要在于堆,本猪之前之前都不知道堆是什么。。更不知道大小堆的概念。。故这里仅看懂了思路,但是并没能够重现出来,因为并没有看懂如何维护堆,故在此留坑,看明白如何维护堆的时候,再另作整理。以下为答案:

构建一个最大堆和一个最小堆,分别存储比中位数小的数和大的数。当目前两堆总数为偶数的时候,把数字存入最大堆,然后重排最大堆,如果最大堆的堆顶数字大于最小堆堆顶数字,则把两个堆顶数字交换,重排两堆,此时两堆数字总数为奇数,直接输出最大堆堆顶数字即为中位数;如果当前两堆总数为技术的时候,把数字存入最小堆,重排最小堆,如果最大堆的堆顶数字大于最小堆堆顶数字,则把两个堆顶数字交换,重排两堆,此时两堆数字总数为偶数,取两堆堆顶数字做平均即为中位数。


在此先码一点堆的基本概念:

(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

(1)堆中某个节点的值总是不大于或不小于其父节点的值;

(2)堆总是一棵完全二叉树。

【最大堆】将根节点最大的堆叫做最大堆或大根堆

【最小堆】根节点最小的堆叫做最小堆或小根堆

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容