国家集训队2005论文集杨俊.doc
文本预览下载声明
浅谈二分策略的应用
华东师大二附中 杨俊
【】【】【】
选择一个在该范围内的某元素作为基准
将待查找元素的关键字与基准元素的关键字作比较,并确定待查找元素新的更精确的范围
如果新确定的范围足够精确,输出结果;否则转至(2)n个不同的数组成的集合S,求其中第i小的元素。
[分析]
相信大家对这个问题都很熟悉,让我们回顾一下二分查找是如何应用于该问题上的。
确定待查找元素在S中
在n个元素中随机取出一个记为x,将x作基准
设S中比元素x小的有p个。
如果ip,表示我们所要寻找的元素比x小,我们就将范围确定为S中比x小的元素,求该范围内第i个元素;
如果ip,表示我们所要寻找的元素比x大,我们就将范围确定为S中比x大的元素,求该范围内第i-p-1个元素;
如果i=p,表示第i小的元素就是x。
如果找出x,输出;否则转至(2)x是随机选出的,由简单的概率分析,可得算法的复杂度期望值为O(n)。
[小结]
举这个例子,是想提醒大家两点:
第一,不要想当然认为二分查找就一定与logn有关。算法中的第(3)(1)时间进行,“分”可以是建立在对序列的有效处理之上(比如上面这个例子中使用了类似于快速排序中的集合分割)。
第二,二分算法的“分”并不要求每次都必须平均(因为有时候可能很难做到这一点),只要不是每次都不平均就已经可以产生高效的算法了,这样也给使用随机化算法带来了契机。
近年来由于交互式试题的出现,也给予二分查找更多活力。相当多的二分查找问题都是以交互式试题的形式给出的。比如说,就上面这个例子,摇身一变就成了一道交互式的中等硬度问题(IOI2000)。两个题目如出一辙:你问第i小的,我问第(N+1)/2小的;解法当然也就依样画葫芦:你用随机取出的x,依照与x大小关系分成两段,我就随机取出x,y,依照与x,y大小关系分成三段;你的复杂度期望是O(n),我的询问次数的期望也是O(N)。(具体细节这里不再展开,有兴趣的同学可以参考前辈的解题报告)
类型二:二分枚举——应用于退化了的有序序列
二分策略并不总是应用于上述这样显式的有序序列中,它可能借助于问题某种潜在的关联性,用于一些隐含的退化了的有序序列中。与先前介绍的二分查找相比,最大的区别在于这里的二分在判断选择哪一个部分递归调用时没有比较运算。
我们还是先看一个问题——BTP职业网球赛(USACO contest dec02)
[问题描述]
有N头奶牛(N是2K),都是网球高手,每头奶牛都有一个BTP排名(恰好为1—N)。下周将要进行一场淘汰赛,N头奶牛分成N/2组,每组两头奶牛比赛,决出N/2位胜者;N/2位胜者继而分成N/4组比赛……直至剩下一头牛是冠军。
比赛既要讲求实力,又要考虑到运气。如果两头奶牛的BTP排名相差大于给定整数K,则排名靠前的奶牛总是赢排名靠后的;否则,双方都有可能获胜。现在观众们想知道,哪头奶牛是所有可能成为冠军的牛中排名最后的,并要求你列举出一个可能的比赛安排使该奶牛获胜。(限制N≤65536)
[分析]
由于N很大,我们猜想可以通过贪心方法解决。
我们希望排名靠前的选手总是“爆冷”输给排名靠后的选手。于是我们让1输给K+1、2输给K+2……每一轮中每一局总是选择未比赛的排名最前的选手,输给一个排名最靠后的选手(如果有的话)。
但我们很容易找到反例,例如:N=8, K=2,由上述贪心方法我们得到对阵方式结果为4,见图BTP-1(其中X?Y表示X战胜Y)。
图BTP-1 图BTP-2
但最优解为6,见图BTP-2。究其原因,因为我们不知道最优解是多少,所以我们是在盲目地贪心。事实上,最优解的6在第一轮就被我们淘汰了,当然就得不到最优解喽!
要想知道最优解?枚举!同时考虑到一个很显然的结论——如果排名为X的选手最终获胜,那么排名在X前的选手也可以获胜。
显然归显然,证明它我们还需要动一点小脑筋。假设排名X的选手最终获胜,我们通过对该对战方式的局部修改,构造出一种新的对战方式使任意排名YX的选手获胜:在X最终获胜的对战方式中,假设Y是被Z击败。如果Z≠X,由XY,可知Z一定也能击败X,且同一轮及此后X所击败的选手都能被Y击败,所以我们只需要在此轮让Z击败X,并把之后所有对战中的X都改成Y即可;如果Z=X,由XY,我们就让Y击败X,同样把之后对战中的X都改成Y,则最后获胜的也是Y。
因此,我们就可以用二分枚举最终获胜的X,大大提高了算法效率。
现在的问题是,如果我们知道最终获胜的是X,我们能否很快构造出一种对战方式或是证明不存在吗?可以,我们仍旧使用贪心,不过因为我们知道最终谁获胜,所以我们采用倒推。
每一轮,我们都让已有选手去战胜一个排名最靠前的还未出现的选手,由该方法产生的对战方式就如图BTP-2所描述那样。至于最靠前的未出现选手如何找,我们可
显示全部