摘要:
应用
寻找前 M 个最大(小)值
- 排序法
- PQ Elementary
- PQ heap-based
追踪序列 median
https://www.youtube.com/watch?v=VmogG01IjYc
https://www.hackerrank.com/challenges/find-the-running-median/problem?h_r=internal-search
https://medium.com/@eranda/running-median-with-heaps-829522330e8a
给定一个整数数组,顺序输入,输出对应每个整数输入后,现有的数组的中位数。
思路:
使用两个 heap,一个大顶堆,所有的值都小于中位数, lowerMaxHeap,一个小顶堆,所有的值都大于中位数 higherMinHeap。这样两个顶堆的顶部就是贡献中位数的数值。这里还存在几个问题
- 保证两个顶堆差值不超过1,这样顶部数值才靠近或就是中位数
- 中位数计算有两种情况:总数为奇数或偶数。如果为奇数,必然两个顶堆大小查1,那个取出顶堆大小大的那个堆的顶部即为 median。如果为偶数,两个顶堆大小一样,取出两个顶部,求平均值。
注意 Java Priority Queue 的默认是小顶堆,也就是顶部为最小值。另外这里一定别把 大小顶堆和 比中位数大或小混淆。比中位数大的用小顶堆,这样顶部就是比中位数小的数中的较大者,比中位数小的用大顶堆,这样顶部就是比中位数大的数中的较小者。
这个算法完全根据了中位数的特点设计。
1 | static double[] runningMedian(int[] a) { |
Full v.s. Complete Binary Trees
According to wikipedia
- A full binary tree (sometimes proper binary tree or 2-tree) is a tree in which every node other than the leaves has two children.
(http://web.cecs.pdx.edu/~sheard/course/Cs163/Doc/FullvsComplete.html)
- A complete binary tree is a binary tree in which every level, except possibly the last, is completely filled, and all nodes are as far left as possible.
(http://web.cecs.pdx.edu/~sheard/course/Cs163/Doc/FullvsComplete.html)
通过观察,二叉完全树是可以压缩为数组表示,不会出现歧义,因为每一层都会尽可能填满,并且填充顺序是从左向右,只有最后一层右侧有空缺。