类型一二分查找——应用于一般有序序列-Read.doc

类型一二分查找——应用于一般有序序列-Read.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
类型一二分查找——应用于一般有序序列-Read.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)步,即我们通常所说的“分”并不要求每一次都必须在O(1)时间进行,“分”可以是建立在对序列的有效处理之上(比如上面这个例子中使用了类似于快速排序中的集合分割)。 第二,二分算法的“分”并不要求每次都必须平均(因为有时候可能很难做到这一点),只要不是每次都不平均就已经可以产生高效的算法了,这样也给使用随机化算法带来了契机。 近年来由于交互式试题的出现,也给予二分查找更多活力。相当多的二分查找问题都是以交互式试题的形式给出的。比如说,就上面这个例子,摇身一变就成了一道交互式的中等硬度问题(IOI2000)。两个题目如出一辙:你问第i小的,我问第(N+1)/2小的;解法当然也就依样画葫芦:你用随机取出的x,依照与x大小关系分成两段,我就随机取出x,y,依照与x,y大小关系分成三段;你的复杂度期望是O(n),我的询问次数的期望也是O(N)。(具体细节这里不再展开,有兴趣的同学可以参考前辈的解题报告 2000-2002集训队论文《中等硬度解题报告》高岳 ) 类型二:二分枚举——应用于退化了的有序序列 二分策略并不总是应用于上述这样显式的有序序列中,它可能借助于问题某种潜在的关联性,用于一些隐含的退化了的有序序列中。与先前介绍的二分查找相比,最大的区别在于这里的二分在判断选择哪一个部分递归调用时没有比较运算。 我们还是先看一个问题——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……每一轮中每一局总是选择未比赛的排名最前的选手

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档