对顶堆

这个玩意是可以动态维护第k大的值,每次操作logn。

大根堆Q1

q1:维护集合中较小值的部分的最大值。

小根堆Q2q

q2:维护集合中较大值的部分的最小值。

 

听不懂?没关系,接着看

为了方便,我们用鸡和凤来比喻这两个堆

换句话来说,以鸡头凤尾来比喻这两个堆,q1的堆顶就是鸡头,q2的堆顶就是凤尾;

由此可见,q2.top>q1.top;

关于插入:

     如果新来的小崽比鸡头还厉害,那么它就进入凤堆(否则它会对上天的选择不满);否则进入鸡堆;可以发现,这样操作并不破坏原有的特性;

关于调整:

     有时小鸡的数量比凤的数量要小得多,那么为了让凤得到优越感,她们会将凤群中的弱者打回小鸡(别问我怎么打的),也就是把凤堆的尾巴改成鸡头,直到两者的数量处于平衡态(目前你不需要理解什么是平衡态,下面会说到);

   如果反之,那么小鸡中的佼佼者便会经历涅槃成凤,成为凤尾。

关于询问:

     如果问第k大的值,我们发现,如果凤堆中一共有k只凤,那么凤尾(堆顶)便是答案,那么之前所说的调整中的平衡态便是维持凤堆中的凤的数量等于k;

 

看懂凤鸡之间的关系了吗?如果看懂了那么你就会对顶堆了;

下面简述对顶堆:

维护小根堆的数量是k,通过和大根堆之间的元素转移来维护这个性质;

posted @ 2019-09-09 17:24  神之右大臣  阅读(181)  评论(0编辑  收藏  举报