【算法】第二章上機實驗報告
實踐題目; 二分查找。
問題描述:輸入n值(1<=n<=1000)、n個非降序排列的整數以及要查找的數x,使用二分查找算法查找x,輸出x所在的下標(0~n-1)及比較次數。若x不存在,輸出-1和比較次數。PS:該問題就是查找/搜索題,以實例,輸入n個數值,從中間開始查找關鍵字x,比較mid與x,查找成功則輸出,不行就將mid與x比較,縮小查找範圍,還要記錄比較次數
算法描述:int Binary(int a[],int n,int key)
{
int x; //定義變量
int left=0,t=0;
int right=n-1;
while(left<=right) //設置
{
int mid=(left+right)/2; //二分法的基本思想,將n個元素等分 ①
t++; // 記錄比較次數,每做一次比較即有t值加一 ②
if(a[mid]==key) // 將中值與關鍵字進行比較。
{
cout<<mid<<endl; //輸出
cout<<t;
return mid;
}
if(a[mid]<key) //關鍵字大於中值,則將left左值變成中值+1,往右縮小查找範圍。
{
left=mid+1;
}
else right=mid-1; //同理,關鍵字小於中值,則將right右值變成中值-1,往左縮小查找範圍。
//再次回到條件,執行①②;
}
cout<<"-1"<<endl;
cout<<t;
return -1;
}
時間復雜度和空間復雜度:以最壞情況考慮,二分查找第一次在n/2中查找(n為元素個數);第二次在一半的一半中查找,即n/2/2=n/4;……第x次在n/2^x範圍內查找,即2^x=n(x=log2^n),所以時間復雜度為O(log2^n)。另外,這個是非遞歸情況,在這個過程中,輔助空間為常數級別,所以空間復雜度為O(1)。
心得體會:
一、本次實踐收獲:和隊友一起變成的準確率的確提高了不少,而且完成地變自己一個人時更有效率,還有,在編程過程中,我們一起討論問題,自己說錯了隊友會及時說出正確的解答,說對了隊友也能補充一下,就這樣彼此對題目的有了更深刻的印象。有時討論問題也會引申出其他的知識,促進自己去思考,上述種種讓我收益頗豐!
二、疑惑:有時候,兩個人的力量也是有限的,就像編程第二題時,老師給我們提了一下意見,但是我們兩個人沒有優化好算法,最後還是再次問老師才解決了,還有的話,結對確實要兩個人的編程水平大致一樣,這樣的話雙方才會有更大的進步,因為如果一個很厲害,另外一個一般,這樣可能會出現分工不均的情況。(當然啦,我和我的隊友合作的很愉快)
【算法】第二章上機實驗報告