1. 程式人生 > >淺談對二分思想的理解

淺談對二分思想的理解

搜索問題 turn class 中一 不能 運算 color arch 因此

1、什麽是二分思想?

二分思想可以理解為是一種將一個大問題分成兩個子題,當每次分析完兩個子問題後,舍棄其中一個不符合條件的子問題,再將符合條件的子問題一分為二,反復循環搜索判斷的操作,直至找到所求的數值或者子問題不能再一分為二時為止的思想。

2、二分搜索算法

二分搜索算法是運用二分思想和分治策略的典型例子。

問題描述:給定已排好序的n個元素a[0: n-1],現要在這n個元素中找到一特定元素x,找到x時返回其在數組中的位置,否則返回-1

3、二分思想代碼實現

以上述二分搜索問題作為例子

非遞歸:

 1 int BinarySearch(int a[], int x, int n) 
 2
{ 3 int left = 0; 4 int right = n -1; 5 While(left <= right) { 6 int middle = (left + right)/2; 7 if(x == a[middle]) return middle; 8 if(x > a[middle]) left = middle + 1; 9 else right = middle -1; 10 } 11 return -1;//未找到x,返回-1 12 }

遞歸:

 1
int BinarySearch(int a[], int left, int right, int x) 2 { 3 int middle; 4 middle = (left + right)/2; 5 if(left > right) return -1;//數組為空 6 if(left == right) {//數組只有一個元素 7 if(x == a[left]) return left; 8 else return -1;//未找到x 9 } 10 if(x == a[middle]) return
middle; 11 else if(x < a[middle]) return BinarySearch(a, left, middle-1, x) 12 else return BinarySearch(a, middle+1,right, x) 13 }

4、該二分搜索算法時間復雜度分析

非遞歸算法時間復雜度:每執行一次循環,待搜索的數組的大小就減少一半。因此在數組長度為n的最壞情況下,while循環被執行了O(logn)次,而循環體內運算需要O(1)時間,故整個算法在最壞的情況下的時間復雜度為O(logn)。

遞歸算法時間復雜度:根據分治法的思想,將原問題分成兩個子問題,即T(n)=2T(n/2) + f(n),而總的長度為n,合並起來的時間復雜度為f(n) = O(n),因此,整個算法的時間復雜度為T(n)=2T(n/2) + O(n) = O(logn)。

5、結對編程情況匯報

和兩個小夥伴一起討論和分析了算法課本第二章的幾個重要算法,如二分搜索算法、合並排序、快速排序等等。我們分別從遞歸和非遞歸入手,想要從兩個不同的算法形式中探討幾個算法的時間復雜度,討論過程中的思維碰撞讓人受益匪淺。由於有一個小夥伴是來自信管專業的,我們又從java和c++兩種不同的編程語言下,對這幾種算法進行編程和研究。

淺談對二分思想的理解