對二分法思想的理解 及 結對程式設計情況彙報
一、對二分法思想的理解
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]) returnmiddle; 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的結對程式設計在一定程度上拓寬了自身的解題思維,也幫助自己更好地去套用每一個演算法。