(sdau) Summary of the eighth week.(二分法)

一:二分法查找。

也称为折半法,是一种在有序数组中查找特定元素的搜索算法。
个人理解:高中的数学中也有二分求解方程的方法,两种概念是类似的。通俗一点想法就是把未知数的区间缩小为从中间分开的两份1/2,看那边能够取到未知数,依次均分为二的缩小区间。简言之二分法就是通过中间值(mid)与要查找的值(n)作比较,每一次比较都可以缩小其的查找范围; 优点就是时间比较快。

二分法查找的思路如下:

(1)首先,从数组的中间元素开始搜索,如果该元素正好是目标元素,则搜索过程结束,否则执行下一步。

(2)如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤(1)的操作。

(3)如果某一步数组为空,则表示找不到目标元素。
(二分法查找的时间复杂度O(logn)。)

二分查找易错的地方

1,循环退出的条件
注意是l <= r,而不是l<r.

2,mid的取值
如果写成 mid (l+r)/2是有问题,如果l和r比较大,两者的和可能会溢出改进的方案low+(r-l)/2,但是计算机位运算比除法快,故可改成l+((r-l)>>1)

简单的二分法是很容易理解的,但是具体应用起来还是会有

int dichotomy(int arr[],int left,int right,int findNum) 
{
    //此处的arr[]应该是排好序的,以从小到大排序。
    	while (left <= right)
    	 {
    		int mid = (left + right) / 2;
    		if (findNum == arr[mid]) 
    		  return mid;
    		if (arr[mid]<findNum) 
    		{
    			left = mid + 1;
    		}
    		else 
    		{
    			right = mid-1;
    		}
    	}
    	return -1;
    }  

二,个人经验总结

首先一个基本的事实就是二分法一定有两个指针(l和r)在移动和一个中间位置mid(要是没有还能算二分法?),二分法实际上就是在通过迭代这两个指针到指定的位置,只是迭代的条件可能式多样的(不一定像经典二分法那样与中间值比较)。而迭代的过程就是在淘汰当前确定不是最终解的某个范围。最后误差小于允许的误差就可以得到解了。

之前做“树”的题时就已经对二分算法掌握的还可以了,但毕竟当时是按照类型做的题,能做出题目确实很轻松,因为思路都差不多,有些题我就按照上一题的代码改改跳出的条件就ac了,这次再次学习二分法希望能再熟练。

总结近期cf比赛:

最近打了两场dv3和两场dv2,前面两场一场dv2 一个题都没做出来,但交了三个题的答案,虽然没出ac但感觉能理解题意并有自己想法写出样例对的代码也蛮不容易的,隔天看题解,写的代码比我自己当时写的短很多,有些不认识的符号搜了也没懂,看题解还是有点费力气,当时应该是只看懂了两道题解,以后看懂题解要养成写写博客的习惯。有一场dv3应该是做出一道题,但a题也太简单了,没什么挑战,就是很水,其实有时候确实跟当时的思路有关系,可能我当时也是一下就懂了题意就做出来了,有时候就会卡住完全想不出来,还是做的题少吧。后面两场相比较而言就比较满意了,dv3出了三道题,那种最后两分钟居然还能改对题真的有点快乐,之前都是最后看不懂就很烦躁的浪费了最后十几分钟,真的很锻炼耐心。dv2出了两道题,之前做题样例对并且自己感觉没错就会通过,这次a题第一次交居然错了,也还是有点烦的,那种改题是最痛苦的过程了,我做题基本一遍对就对了,只要不对那改起来就要半个多小时,改题真的很浪费时间,希望做题多了能够第一次就读清楚题意,第一次代码就通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值