1. 程式人生 > >對二分法思想的理解 及 結對編程情況匯報

對二分法思想的理解 及 結對編程情況匯報

匯報 實踐 選擇題 輔助 解題思維 log 成了 需要 迷茫

一、對二分法思想的理解

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的結對編程在一定程度上拓寬了自身的解題思維,也幫助自己更好地去套用每一個算法。

對二分法思想的理解 及 結對編程情況匯報