標籤:int 複雜 語句 分治 lse 複雜度 bsp include 二分
第二章實驗報告
20171003172 陳滿
1.
7-2 改寫二分搜尋演算法 (20 分)
題目來源:《電腦演算法設計與分析》,王曉東
設a[0:n-1]是已排好序的數組,請改寫二分搜尋演算法,使得當x不在數組中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在數組中時,i和j相同,均為x在數組中的位置。
輸入格式:
輸入有兩行:
第一行是n值和x值; 第二行是n個不相同的整數組成的非降序序列,每個整數之間以空格分隔。
輸出格式:
輸出小於x的最大元素的最大下標i和大於x的最小元素的最小下標j。當搜尋元素在數組中時,i和j相同。 提示:若x小於全部數值,則輸出:-1 0 若x大於全部數值,則輸出:n-1的值 n的值
2.問題描述:求x與這個數組中的元素的關係
3.演算法描述:
#include<iostream>
using namespace std;
int BIN(int a[],int n,int key)
{
int left=0;
int right=n-1;
int t=0;
if(key>=a[0]&&key<=a[n-1]){
while(left<=right)
{
int middle=(left+right)/2;
t++;
if(key==a[middle])
{
cout<<middle<<" "<<middle<<endl;
return middle;
}
if(key>a[middle]) left=middle+1;
else right=middle-1;
}
int j;
for(j=1; j<n; j++)
{
if(key<a[j])
break;
}
cout<<j-1<<" "<<j;
}
if(key<a[0]) cout<<-1<<" "<<0;
if(key>a[n-1]) cout<<n-1<<" "<<n;
}
int main()
{
int n,x;
cin>>n>>x;
int a[n];
for(int i=0; i<n; i++)
cin>>a[i];
BIN(a,n,x);
return 0;
}
先判斷元素是否在數組的區間內,然後採用二分尋找判斷x是否為數組內元素,是則輸出middle middle;否則輸出j-1,j;
然後判斷x是小於數組全部元素還是大於數組全部元素
4.時間複雜度分搜尋法充分利用了元素間的次序關係,採用分治策略,可在最壞情況下用O(logn)時間完成搜尋任務。每執行一次while迴圈,待搜尋數組的大小就減小一半。因此在最壞情況下,while迴圈被執行了O(logn)次。迴圈體內外運算需要O(1)的時間。因此整個演算法在最壞情況下的時間複雜度為O(logn)。
空間複雜度:二分搜尋法的空間複雜度為O(1)。此演算法的空間複雜度為一個常量,即不隨被處理資料量n的大小而改變時,可表示為O(1)。
5.心得體會:
二分尋找法更加快速便捷。
在做題過程中,範例的情況錯誤,後來發現是語句錯了,其他沒什麼太大問題。
第二章實驗報告