第二第三章上機實驗報告
阿新 • • 發佈:2021-11-01
1.題目:二分法求函式的零點
總時間限制:
1000ms
記憶體限制:
65536kB
描述
有函式:
f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2+ 274 * x - 121
已知 f(1.5) > 0 , f(2.4) < 0 且方程 f(x) = 0 在區間 [1.5,2.4] 有且只有一個根,請用二分法求出該根。
輸入
無。
輸出
該方程在區間[1.5,2.4]中的根。要求四捨五入到小數點後6位。
樣例輸入
無
樣例輸出
不提供
2.演算法描述
使用二分法,由題可知,這個函式在[1.5,2.4]內單調遞減,當f(x)>0時,將mid+1賦給左邊界left;當f(x)<0時將mid-1賦給右邊界right。通過不斷地取left,right的中值,進行查詢比較,當right,left之間的距離小於1e-7時停止,此時的f(mid)為0或非常接近0,mid則為所求的根。
void bSearch(double left, double right) {
if (fabs(right - left) > 1e-7) {
mid = (left + right) / 2;
if (f(mid) > 0)
return bSearch(mid+1, right);
if (f(mid) < 0)
return bSearch(left, mid-1);
}
}
3.演算法時間和空間複雜度分析
時間複雜度:採用分治策略,分解子問題的時間複雜度為O(1),每個子問題的規模為n/2,則解決子問題所需時間為T(n/2),所以T(n)=O(1)+T(n/2)=O(logn)
空間複雜度:該演算法用了遞迴,每次遞迴中需要的空間是一個常量,並不會隨著n的變化而變化,每次遞迴的空間複雜度就是O(1)。又遞迴深度為logn,所以該演算法的空間複雜度為O(1*logn)=O(logn)
4.心得體會
二分法是一個很好的演算法,但是上機的時候還是很不熟練,不斷地看書和詢問同學,打完後確實有了很深的印象
5.對分治法的個人思考和感悟
二分法可以把一個很大的範圍通過二分,不斷的縮小查詢的範圍,查詢速度很快