1.二分法和分治法的概念区别:
二分搜索每次都要舍弃一半,从留下的一半中寻找目标;而分治法把一个大问题分成两个或多个小问题,递归地求这些小问题的解,最后再把它们小心谨慎的合并起来,并且要仔细考虑合并时产生的新的情况。这当然没有错,但你也马上会从这里意识到两者的巨大联系。就拿选取数组中第k个最小的数的算法来说,有一个版本便是从快速排序中修改而来:划分后,舍弃掉不存在的区间,对剩余部分迭代(后文将进行讲解),而快速排序是分治法的典型代表。
二分应用场景
二分法常用来查找单调序列或单调函数上的答案.当问题的答案具有单调性时,可以考虑通过二分求解.
先思考一个简单问题
A心里想一个1-1000之间的数,B来猜,B可以问问题,A只能回答是或者不是,怎么猜才能问的问题次数最小?
是1吗?是2吗?……平均要问500次
大于500吗?大于750吗?大于625吗?……每次缩小猜测范围到上次的一半,只需要10次(log21000)
这就是二分法的一个简单运用.
二分的实现方法有很多种,对于整数集合上的二分,需要注意终止边界,左右区间取舍时的开闭,避免漏掉答案或造成死循环;对于实数域上的二分,需要注意精度的取舍.