1. 程式人生 > 其它 >第二第三章上機實驗報告

第二第三章上機實驗報告

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.對分治法的個人思考和感悟

二分法可以把一個很大的範圍通過二分,不斷的縮小查詢的範圍,查詢速度很快