算法实践报告
项目名称:二分法求函数的零点
问题描述:给定一个已知一定有根的单调函数,给出一个异侧的根的区间,要求通过二分法求出函数的解并保留小数点后六位。
算法描述:
因为该函数一定有根,通过两区间不断逼近必定能找到根,最后根据题目提醒的判别式判断是否等于0;
算法:开始用数组存储两个区间,通过区间算出“mid”值,将mid带入函数中判断是否大于0,小于0,或等于0,若等于0则为根,若大于0则
说明根在mid右边,左边界需要继续往右缩进,所以mid的值变成left,重新计算mid值递归该过程,若小于0则说明根在mid左边,右边界需要
往左缩进,所以mid值给right,然后继续计算mid,递归该过程。直达f(mid)等于0即跳出循环。得出答案。
时间复杂度和空间复杂度分析:
本题中的二分算法是通过两个边界计算出mid值,每次都用mid值去判断是否大于小于或等于0,若大于0,则要找的值在数组右边,小于0则要
找的值在数组左边。每次进行二分查找的元素基数都为上一次查找基数的二分之一,最后一次查找的元素基
数肯定会大于一,则假设用二分法在N个元素中查找某个元素,则第一次,第二次,第三次,第n次的查找元素基数分
别为N,N/2,N/4......N/(2^n),由此可得简单表达式如下:N/(2^n)>=1 ----> N>=2^n ----> log2N>=n ----> o(n)=o(logN)
空间复杂度:
o(1)
心得体会:
在这一题中,看见时间复杂度为logn就知道要用分治法,但是这题中要明白该函数一定有根,只要不断逼近就一定能找到,同时要看清楚题目中1.5大于0,2.4小于0
判断出是单调递减函数,来设置算法中判断完>/<0时两边界是mid给left还是right。
分治法的个人体会与心得:
分治法每次能把样本折半筛选,不用整个数组遍历的查找,能快速的找到目标。