关于双堆维护数组中位数,百度了下,貌似很多人都搞错了原理。这里介绍下:
双堆(median-heap)包含一个小根堆,一个大根堆,每个堆包含全部data的一半。小根堆的数据大于等于中位数,大根堆的数据小于等于中位数。
(1)当小根堆比大根堆多一个data时,中位数是小根堆的堆顶;同理大根堆比小根堆多一个数据时,中位数是大根堆的堆顶。
(2)当两个堆的数据一样多时,那么全部数据个数是偶数,这个时候中位数的选择要根据自己所确定的中位数定义(取均值,偏大,偏小等等)
(3)每次插入数据,将数据与堆顶的数据比较来确定插到哪个堆里。如果要插入的元素比现在的中位数大,插入小根堆;否则插入大根堆。如果两个堆的data个数相差超过1,有可能需要平衡两个堆:将数据较多的那个堆的堆顶拿出插入到另外个较少的堆中。