思考:
例一:
如果只是单纯从一个有序非重复的列表中查找某个值是最简单的
但是如果遇到这个列表(非降序)中有重复值,比如[1,2,2,2,3],要找出数组中第一次出现元素2所在的位置,(这里是第1个值)该怎么处理。
下面写一段程序来实现
对数组切分,查找中间数是否大于等于待查找数,如果是,记录此时的数值位置,对左边部分再做切分,取中间值,再进行比较,如果小于待查找数,再对右边部分做切分,取中间值。。。最后返回取得的数值位置,即为数组中第一次出现该元素的位置
若要取最后一次出现该元素的位置,同理,只需把记录位置的那条放到else里面。。
例二:
二分查找求方程的根
有函数f(x)=x³-5x²+10x-80=0,求方程的根
若求出的根为a,要求|f(a)|<1e-6(10的-6次方)
注意这里求根,我们需要的并不是带根式的某个具体值,我们只需要得到一个足够精确的实数值
分析:对f(x)求导,得知导数恒大于0,即该函数单调递增,可以使用二分查找得到方程的根,由函数式易知f(0)<0,f(100)>0,即方程的根在0到100之间,下面写一段程序:
定义函数f(x),设置0到100的范围,root表示取中点,只要求的函数值的绝对值大于设定的范围10的-6次方,就一直循环,当y>0时,对左半部分取中间值,如果不是,反之,循环一次更新一次root和y并记录次数,直到跳出循环,打印root和循环次数
显然这里只做了32次循环就达到预期结果
如果使用顺序查找,则需要从10的-6次方开始查找,每次加10的-6次方,直到找到根,这里的循环次数显然太多了,由此可见二分查找在解决某些问题的时候,显示出了非常高的效率