从实训正式开始的9号到现在25号的时间里,首先因为对c++语法的不熟悉以及太久没学c了,所以最开始是在洛谷上刷题(入门题目比较多),由于网课天然抗拒性,mooc网现在的进度在分治(摸鱼)。
主要还是讲讲自己对二分算法的主观心得。
首先二分算法也就是二分思想,其衍生出的二分查找在七大查找算法中位列第二,其相对于顺序查找能够减少程序的查找次数,加快运行时间,这是它的优势,但我们也知道,使用二分查找的先决条件是有序数组,并且在实际使用的过程中对左右边界的处理容易出错,这么看来,二分查找似乎成为了一种食之无味弃之可惜的工具,所以这时候我们就应该扩宽思路,二分查找是二分思想的典型,那么二分思想的本质是什么?
这里首先给出二分查找的基本模板:
public static int Method(int[] nums, int low, int high, int target)
{
while (low <= high)
{
int middle = (low + high) / 2;
if (target == nums[middle])
{
return middle;
}
else if (target > nums[middle])
{
low = middle + 1;
}
else if (target < nums[middle])
{
high = middle - 1;
}
}
return -1;
}
实现的过程是依靠找到数组下标后,其值与左右边界比较,再通过对target的比较,裁掉一块边界,然后重新找到新的中间数,然后循环。
再简化:
while(l < r){
int mid = (l + r) / 2;
// 如果 满足/不满足 性质
if(check(mid)) 更新边界1
else 更新边界2
}
/*
check函数用于判断mid位置的元素是否满足定义的性质
*/
其实这也挺好理解,比如一对有序数组
1 2 3 4 5 6 7 8 9
如果我们要找的数字是2,那么第一次二分mid的元素就是5,留下的数组就是
1 2 3 4
那么这个裁掉右边这一部分的过程中就区分开了:
1 2 3 4 5(检查是否是中间数若不满足则去掉) 6 7 8 9
满足性质 不满足性质
那么每一次二分的过程其实就是对整个数组左右边界的性质的检查,留下满足性质的,裁去不满足的。
显然,这个性质包含了有序数组且大于某一数这样的个例,也可以是其他的性质。
但实际上我还没找到比较典型的例题- -,所以只能留个坑,等以后再来填了。
by 树莓202 syh