對二分法思想的理解 及 結對編程情況匯報
一、對二分法思想的理解
1.特點:又稱為折半算法,是分治策略的一個典型例子。主要是用於:在已排好序的n個元素組成的數組a[0:n-1]中,找出一個特定的元素x。
2.基本思想:(1)將n個元素分成個數大致相同相同的兩半,然後取a[n/2]與x作比較。
(2)如果x = a[n/2],則已找到x,返回下標並結束算法;
如果x < a[n/2],則只在數組a的左半部繼續搜索x;
如果x < a[n/2],則只在數組a的右半部繼續搜索x;
3.時間復雜度:在二分搜索算法中,x每進行比較,待搜索的數據範圍就折半一次,直到找到x;
最壞情況為數組中沒有x,則x需進行log n次比較,此時二分搜索算法的時間復雜度為O(log n);
最好情況為x為數組最中間的值,即x只需進行一次比較,此時二分搜索算法的時間復雜度為O(1);
4.空間復雜度:在二分搜索算法中,只需要n個空間用於存放n個元素組成的數組a,無需其余輔助空間,所以二分搜索算法的空間復雜度為O(1);
5.優點:時間復雜度小,可用於數據量較大的情況。
6.缺點:只可用於一事先排好序的數組。
7.實現算法
(1)循環
int BinarySearch(int a[],int x,int n) { int left = 0,right = n-1; while(left <= right) { int middle = (left+right)/2; if(x == a[middle]) return middle; if(x < a[middle]) right = middle - 1; else left = middle + 1; } return -1; }
(2)遞歸
int BinarySearch(int a[],int left,int right,int x) { int middle = (left + right) / 2; if(x = a[middle]) return middle; if(x < a[middle]){ BinarySearch(a,left,middle-1,x); } else{ BinarySearch(a,middle+1,right,x); } return -1; }
二、結對編程情況匯報
跟partner結對至今,我們總共開展了兩次合作討論。
第一次合作是討論pintia上的“第二章作業”。剛開始時,我們對於選擇題第7、12和15題的答案都是有點迷茫的,所以我們重點針對這些題目查找一些相關的資料並展開討論,在經過多次討論之後,我們最終成弄懂這些題目的含義並算出正確的答案。
第二次合作是共同完成pintia上的“第二章實踐”,由於我partner在課前已事先完成了這些題目,所以在課上,主要是我負責在思考解題方式和敲代碼,而我partner主要負責在旁邊忙糾錯。三道題完成後,我們倆針對如何采用二分法解決第三題這個問題展開了討論,並得出了解法的基本思想,但還有許多細節有待繼續討論。
總而言之,這次個partner的結對編程在一定程度上拓寬了自身的解題思維,也幫助自己更好地去套用每一個算法。
對二分法思想的理解 及 結對編程情況匯報