1. 程式人生 > >【算法】第二章上機實驗報告

【算法】第二章上機實驗報告

也會 left 級別 family 基本 問題 str 排列 但是

實踐題目; 二分查找
問題描述:輸入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) //設置

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)

心得體會:

一、本次實踐收獲:和隊友一起變成的準確率的確提高了不少,而且完成地變自己一個人時更有效率,還有,在編程過程中,我們一起討論問題,自己說錯了隊友會及時說出正確的解答,說對了隊友也能補充一下,就這樣彼此對題目的有了更深刻的印象。有時討論問題也會引申出其他的知識,促進自己去思考,上述種種讓我收益頗豐!

二、疑惑:有時候,兩個人的力量也是有限的,就像編程第二題時,老師給我們提了一下意見,但是我們兩個人沒有優化好算法,最後還是再次問老師才解決了,還有的話,結對確實要兩個人的編程水平大致一樣,這樣的話雙方才會有更大的進步,因為如果一個很厲害,另外一個一般,這樣可能會出現分工不均的情況。(當然啦,我和我的隊友合作的很愉快)

【算法】第二章上機實驗報告