算法基础(四):二分算法

慕课:程序设计与算法(二)算法基础 郭玮老师课程的学习笔记

二分查找
一、基础:时间复杂度
二、二分查找原理
三、二分查找求方程的根
四、例题:找一对数
五、例题:农夫和奶牛
1、时间复杂度:也称复杂度。即程序或算法的时间效率,通常O和n来表示,例如用O(n)、O(n^2)等表示,通过计算关键步骤需要被执行的次数来衡量。


固定操作可以理解为关键性的操作,通常需要具体问题具体分析,不过大概可以理解为较为重要的步骤

而且在计算复杂度时,系数是无须考虑的,如0(n/2)->O(n),当n很大时,不用考虑系数,因为这时候,一百亿和五十亿可以理解为差不多;而且只需要考虑变化快的n的函数,即如果是n^2+n则时间复杂度为O(n^2),因为在这种情况下当n很大时,只需要考虑n^2的值,n<<n^2


在插入排序中,重要步骤可以理解为a[k]=a[k-1],所以关键步骤需要执行n^2次,即时间复杂度为O(n^2)


复杂度有平均复杂度和最坏复杂度两种,一般来说两者一样,有时候两者不一样,而且在一般情况无需考虑两者差别,但是在特定情况需要考虑两者的不同

例如:快速排序,当数据完全随机时即平均复杂度为O(nlogn),当情况糟糕时即当待排序的数据已经排好次序即最坏情况复杂度为0(n^2),不过一般情况下用平均复杂度O(nlogn)表示即可,最坏情况出现的比较少

一般应用中考虑平均复杂度即可,平均复杂度出现的次数占大多数,但是可能在做acm题时考虑最坏复杂度,这种时候以防出题者的坏心思专门给你一个最坏的情况,这时只考虑平均时就有可能超时而中圈套


复杂度是多个n的函数之和时,只考虑增长最快的那个,即当n足够大时,小的那个函数通常远小于大的函数所以可以忽略不算

常数时间,例如压栈、出栈、压入队列等

而指数时间非常大,以致于有时计算机都无法解决


一个问题的复杂度即用最好的方法去解决时的复杂度,例如排序的复杂度通常指O(nlogn),用最快的算法去解决

平面上有n个点,要求出任意两点之间的距离时需要将所有点对都找出来,即O(n^2)组合所有点对

在快速排序和二分查找时使用了对数复杂度O(logn),这里的log无论用log2表示还是ln、lg等都只差一个系数,所以不用考虑,只写log即可

2、二分查找:每通过一次比较或操作将范围缩小,且注意查找的范围内必须有序才可以进行比较


通过比较数大于小于来判断下一个范围属于左还是右,依次缩小距离


(1)初始查找区间为整个数组

(2)那么在待查找区间里寻找答案,取区间的中点,然后比较大小取左或右区间,缩小待查找的区间,改变区间为左或右的区间

(3)继续只要查找区间不为空,继续第二步


注意区间内数据有序排列

为了防止计算中点时过大溢出,采用L+(R-L)/2方式计算

3、二分法求根


由导函数可知,函数递增,且左端点小于零,右端点大于零,则在区间范围内必然有一个根,所以可以在0-100的区间内顺序查找根,优化以二分求解也可,二分法在区间内查找根,每次将区间取中点二分即可


4、找一对数


时间复杂度为1亿时这种时间就很危险了,有时几百万还是可以做到的

而且虽然有时计算是线性复杂度O(n),但是当n=1亿时,复杂度是1亿,还是很高的,所以需要优化算法


排序最好的办法是O(nlogn),这是需要记住的,因为如果用差的排序复杂度还是很高的,下节课讲的库函数可以在O(nlogn)做到排序

排序好之后使用二分查找即可解决,注意要先排序,排序必不可少

一般来说最坏与平均差不多,实际求解时不需要考虑

在这里注意最坏为n-2次,因为查找到an-2时,只需要计算an-2+an-1==m即可,不需要二分查找n-1次


两个指针移动是O(n),但是第一步是排序时nlogn,所以总共是nlogn

5、农夫和奶牛



解法一穷举所有可能情况,复杂度过高


使用二分法进行求解,每次用中点设置距离





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值