算法第二章上機實踐報告

針對PTA上算法第二章實踐中的第二題進行分析ios

實踐題目:算法

  算法第二章上機實踐報告數組

問題描述:函數

  設a[0:n-1]是已排好序的數組,請改寫二分搜索算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜索元素在數組中時,i和j相 同,均爲x在數組中的位置。spa

 

 

算法分析:blog

#include<iostream>
using namespace std;
void find(int a[],int x,int n) //定義一個函數,經過二分查找判斷x位於數組中的哪一個位置或者應插入數組的哪一個位置
{
    int l=0;int r=n-1;
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(x==a[mid])
        {
            cout<<mid<<" "<<mid;
            return;
        }
        else if(x>a[mid])
        {
            l=mid+1;
        }
        else
        {
            r=mid-1;
        }
    }
    if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]爲界,若是x在a[l]左邊,那麼輸出l以及l+1
    if(x>a[l]) cout<<l<<" "<<l+1;//若是x在a[l]左邊,那麼輸出l-1以及l
    return;
}
int main()
{
   int n,x,p;
   int a[100001];
   cin>>n;
    cin>>x;
   for(int i=0;i<n;i++)
   cin>>a[i];
    if(x<a[0])//若x小於所有數值
    {
        cout<<-1<<" "<<0;
    }
    else if(x>a[n-1])//若x大於所有數值
    {
        cout<<n-1<<" "<<n;
    }
   else//
        find(a,x,n);
   return 0;
}

算法時間及空間複雜度分析:ci

  該算法的時間複雜度爲O(log2 n)io

  空間複雜度爲O(1)stream

心得體會:搜索

  原先老師還沒要求時間複雜度爲O(log2 n)時,我是直接在main函數裏直接寫了if進行判斷的,而後一堆的判斷語句。把時間複雜度擴大到了O(n)。後來就開始思索要怎樣將複雜度變小。最後就反思本身的代碼,思考如何在二分查找的find函數裏進行大小判斷,這樣就能夠將時間複雜度變爲O(log2 n)。後來就是在二分查找後,加上了下面這兩個語句。

if(x<a[l]) cout<<l-1<<" "<<l;//以a[l]爲界,若是x在a[l]左邊,那麼輸出l以及l+1
    if(x>a[l]) cout<<l<<" "<<l+1;//若是x在a[l]左邊,那麼輸出l-1以及l
 
  我以爲咱們在作題的時候,不能只是將題目完成了就好,要好好思考怎麼將代碼變得簡潔及時間、空間複雜度降到最優,這也是算法課存在的意義。打題仍是要多思考,多嚴格要求本身,不能想着投機取巧,單純完成題目就好。
 
  而後對上機打題的體驗感很好,能夠和組員一塊兒思考,一塊兒討論,共同完成題目的感受挺好的。
相關文章
相關標籤/搜索