一组数字的中位数是指当项目按排序顺序排列时,项目数为奇数时,中间的数字,或当项目数为偶数时,中位数是中间两个数字的平均数;例如,{3741265}的中位数是4,{4213}的中值是2.5。计算中值的普通算法同时考虑整个数字集;这个流媒体该算法重新计算数字集每个连续前缀的中值,并可应用于无限序列的前缀。例如,原始数字序列的流媒体是3、5、4、3.5、3、3.5和4。
使用两个堆计算流中值。所有小于或等于当前中间值的数字都位于左侧堆中,其排列方式使最大数字位于堆的根。所有大于或等于当前中值的数字都位于右侧堆中,这样安排的目的是使最小数字位于堆的根。注意,任何一个堆中都可以有等于当前中值的数字。两个堆中的数字计数相差永远不会超过1。
当进程开始时,两个堆最初是空的。输入序列中的第一个数字被添加到其中一个堆中,不管是哪个堆,并作为第一个流中值返回。然后将输入序列中的第二个数字添加到另一个堆中,如果右堆的根小于左堆的根,则交换两个堆,并返回两个数字的平均值作为第二个流中值。
然后开始主要算法。将输入序列中的每个后续数字与当前中值进行比较,如果它小于当前中值,则添加到左侧堆中,如果它大于当前中值,那么添加到右侧堆中;如果输入数字等于当前中值,则将其添加到计数较小的堆中,如果计数相同,则任意添加到其中一个堆中。如果这导致两个堆的计数相差超过1,则会删除较大堆的根并将其插入较小堆中。然后,如果两个堆的计数不同,则将当前中值计算为较大堆的根,如果大小相同,则计算为两个堆根的平均值。
您的任务是编写一个函数来计算序列的流媒体。完成后,欢迎您阅读或运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。
页:1 2