这个玩意是可以动态维护第k大的值,每次操作logn。
大根堆Q1
q1:维护集合中较小值的部分的最大值。
小根堆Q2q
q2:维护集合中较大值的部分的最小值。
听不懂?没关系,接着看
为了方便,我们用鸡和凤来比喻这两个堆
换句话来说,以鸡头凤尾来比喻这两个堆,q1的堆顶就是鸡头,q2的堆顶就是凤尾;
由此可见,q2.top>q1.top;
关于插入:
如果新来的小崽比鸡头还厉害,那么它就进入凤堆(否则它会对上天的选择不满);否则进入鸡堆;可以发现,这样操作并不破坏原有的特性;
关于调整:
有时小鸡的数量比凤的数量要小得多,那么为了让凤得到优越感,她们会将凤群中的弱者打回小鸡(别问我怎么打的),也就是把凤堆的尾巴改成鸡头,直到两者的数量处于平衡态(目前你不需要理解什么是平衡态,下面会说到);
如果反之,那么小鸡中的佼佼者便会经历涅槃成凤,成为凤尾。
关于询问:
如果问第k大的值,我们发现,如果凤堆中一共有k只凤,那么凤尾(堆顶)便是答案,那么之前所说的调整中的平衡态便是维持凤堆中的凤的数量等于k;
看懂凤鸡之间的关系了吗?如果看懂了那么你就会对顶堆了;
下面简述对顶堆:
维护小根堆的数量是k,通过和大根堆之间的元素转移来维护这个性质;