- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 (
您可能关注的文档
最近下载
- 自动控制原理(第七版)课后习题答案解析.pdf
- 事件与概率(古典概率、条件概率、全概率公式、贝叶斯公式)小题综合解析- 十年(2015-2024)高考真题数学分项汇编(全国).pdf VIP
- (2025)小学生诗词大会竞赛试题及标准答案.docx VIP
- 临建工程施工组织设计.docx VIP
- 儿童吉兰-巴雷综合征谱系疾病与抗糖脂抗体相关性研究进展 .pdf VIP
- 2025年钛铁项目建设总纲及方案.docx
- AB-罗克韦尔PowerFlex755变频器操作说明.pdf
- 幼儿园小班科学活动《颜色变变变》含课件.pptx VIP
- 2025诗词大会精选100题题库(含答案).docx VIP
- 小学诗词大会精选100题题库(含答案).docx VIP
文档评论(0)