单调队列和其应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单调队列和其应用

二分查找 三分查找 哈希(hash)查找 字符串查找(匹配) 单调队列 二分查找 1、简单定义:在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。 时间复杂度:O (logn),优于直接顺序查找O(n) 例程: 数组中查找 //x:待查找的元素, n:数组集合大小, num数组单调递增 int low=0,high=n,mid,res = -1; //low:集合下界 high:集合上节 while(low=high) { mid=(low+high)/2; //mid:将集合分割为两部分 if(num[mid]==x) //查找到符合元素x { res = mid; break; } else if(num[mid]x) //x在右边部分,调整集合下界 low=mid+1; else //x在左边部分,调整集合上界 high=mid-1; } //若未找到x,则res = -1 查找连续函数的写法 //x:待查找的值,Caculate():所要查找的函数,在这里单调递增 //需保证查找的值在区间范围内 double low=“区间下界”,high=“区间上界”,mid; while(high - low 1.0e-6) { mid = (high + low)/2; if(Caculate(mid)x) low=mid; else high=mid; } 常见拓展 对于某些问题,如果答案具有特定的范围,并且验证答案是否成立的函数具有单调性。则可以在范围内对答案进行二分验证,从而快速确定答案。 例子:披萨 题目大意:有f+1个人分n块披萨,每个人要求分得的面积一样,且披萨只能被切开而不能重新组合,求每个人能分到的最大面积v。 分析:对于每个确定的v,可以计算出最多能满足的人数p。因此得到一个单调递减的函数关系(v越大,P越小),并且v的范围也可以确定为0~max(size(i)),i=1...n。 核心程序 bool judge(long long mid) { long long p = 0; for (int i = 0; i n; ++i) p += size[i] / mid; return p = f; } //由于精度差问题,考虑先将面积*转化为整数来二分 long long res,mid; while (low = high) { mid = (high + low) / 2; if (judge(mid) ) { low = mid + 1; res = mid; //最后结果为res } else high = mid - 1; } 总结 二分的思想在很多领域中都得到了广泛的应用,是很多算法的基础。相信不难理解整个二分查找的框架和用法。 二、三分法 当需要求某凸性或凹形函数的极值,通过函数本身表达式并不容易求解时,就可以用三分法不断逼近求解。 类似二分的定义Left和Right leftmid = (Left*2 + Right) / 3 rightmid = (Left + Right*2) / 3; 如果leftmid靠近极值点,则Right = rightmid; 否则(即rightmid靠近极值点),则Left = leftmid; 例题: ZOJ 3203 Light Bulb /onlinejudge/showProblem.do?problemCode=3203 如图,人左右走动,求影子L的最长长度。 根据图,很容易发现当灯,人的头部和墙角成一条直线时(假设此时人站在A点),此时的长度是影子全在地上的最长长度。当人再向右走时,影子开始投影到墙上,当人贴着墙,影子长度即为人的高度。所以当人从A点走到墙,函数是先递增再递减,为凸性函数,所以我们可以用三分法来求解。 核心程序: double cal(double x) { return (

文档评论(0)

dajia1qi + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档