浅谈二分

part 1 此篇博客简介

此篇博客讲解的是最最基本的二分,会从0教起,如果想要学习二分的进阶应用,请移步至进阶篇的二分讲解 ——2018.8.21(进阶篇大约会在2018年8月25号左右出来)

前置必备技能:

熟练C++循环操作,会在C++内使用自定义函数操作,具备一定的小学数学知识

前置拔高技能(可有可无):

掌握数学中log函数,会简单的估算时间复杂度

本篇博客将要讲解的内容:

二分的定义,分析时间复杂度,简单二分的代码实现

加粗的部分一定要认真看!

part 2 引子

商家做一个产品促销活动,让买家猜一本书的价格,在1-100元之内,每次可以告诉你是小了还是大了,最坏情况下至少需要猜几次?

方法0:从1开始猜,一直猜到100,最坏要猜100次,显然不是最优解。为什么呢?明明每次都可以告诉你是大了还是小了,你这样猜跟告诉你对不对是一样的,并没有用到他给你的条件(即大了还是小了)

方法1:先猜10,小了再猜20,小了再猜30,直到锁定了一个大小为9的区间(比如11-19),再一个一个猜,最坏要猜19次。这个方法比刚才那个好在哪儿?它利用了告诉你大了还是小了这个条件 不过还是有一个缺陷:明明一次猜测可以否决掉更多的数(比如你20个20个一猜)

方法2:先猜50,如果小了就猜75,大了就猜25,一直折半猜下去,直到猜对,最坏需要猜7次。

证明:它每一次都可以否决掉目前区间内一半的数,2的7次方是128,6次方是64,64比100小,显然6次猜不出来是几,128比100大,也就意味着猜7次可以猜到,其实,64-127这个区间猜7次都可以猜到是几,不信就自己试试吧

part 3 定义

这就是我们所说的二分,也被称作折半搜索,知道log函数的OIer一定明白,二分的复杂度是logN。简而言之,log就是求一个数是二的几次方(向上取整,起码在OI中是向上取整,博主我在2018年还是新初一,不知道数学里是怎么算)

part 4 最基本的二分的代码实现

先上代码,下面会有讲解。

【⚠️】前方模板警告请小(qie)心(ji)行(bei)驶(shu)

这里写图片描述

L表示left,R表示right,MID表示middle,也就是区间的左右和中间。我们用answer记录答案。因为是折半搜索,所以mid=(L+R)/2,除以二就担当了”折半”这个任务,而OK这个函数(在代码的第五行)可以根据题目需要调整,也就是说,不管是什么二分的应用题,都可以用这个模板(听起来很棒QwQ) 只需要调整OK函数里面的东西就行了。后面的R=mid-1表示把区间的右指针调整(学过指针的不要误解,这里只是一个变量,只不过我觉得叫成指针比较顺口),调整L就是调整左指针啦

part 5 例题与思考题

这里写图片描述

首先可以肯定,二分必须在一个有序的序列里进行,刚好这个序列已经排好序了。我们二分下标,如果middle所指向的数比k大 那么记录答案,调整R指针,否则调整L指针

二分适用的题目:
这里写图片描述

学会了以上的询问,你就学会了二分查找的基本应用,然而一般的题目是不会那么简单的 会让你求一个问题的答案 而这个答案不好求解好判断对不对 就可以用二分 而OK函数里面就会比较复杂 比如洛谷P1316 作为思考题 有兴趣的就去看看吧
这里写图片描述

part 6 结语与建议

本篇文章只是讲解了最最最最基本的二分,建(yi)议(ding)把前面的模板背下来,而二分的精华其实是在OK函数里面,当然,最基础的二分OK函数里面就一句话,而之后的进阶篇就会讲解,建议把板子背下来之后就去看进阶篇吧!

一篇博客写完了好累啊 你居然看完了QAQ一篇博客都学完了 那么就犒劳一下自己起来动动吧
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值