在数据流中查找中位数,需要动态容器保存。其中涉及到插入操作和查找操作。
![](https://img.haomeiwen.com/i3629436/acd3d91cac4d4b34.png)
综上得知,采用AVL树和最大最小堆来实现是较为理想的。但是AVL树没有现成的函数库,需要自己实现,比较困难。但我们却可以利用C++的STL函数push_heap、pop_heap以及vector实现堆。
那么如何用最大堆和最小堆来寻找中位数呢?
思路是这样的,把数据流的数据分为前后两部分,前面一部分用最大堆实现,后面一部分用最小堆实现,并且最大堆的所有数都小于最小堆的最小值。最大堆的第一个数就是前一部分的最大值,最小堆的第一个数就是后一部分的最小值。中位数就是这两者的平均值(当数据总量为偶数时),或者两者其中之一(当数据总量为奇数时)。
网友评论