- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法合集之《浅谈二分策略的应用》
浅谈二分策略的应用
华东师大二附中 杨俊
【】【】【】
选择一个在该范围内的某元素作为基准
将待查找元素的关键字与基准元素的关键字作比较,并确定待查找元素新的更精确的范围
如果新确定的范围足够精确,输出结果;否则转至(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所描述那样。至于最靠前的未出现选手如何找,我们
文档评论(0)