演算法之二分查詢

2021-08-03 07:33:45 字數 1320 閱讀 8377

總時間限制: 

1000ms 

記憶體限制: 

65536kb

描述在乙個非降序列中,查詢與給定值最接近的元素。

輸入第一行包含乙個整數n,為非降序列長度。1 <= n <= 100000。

第二行包含n個整數,為非降序列各元素。所有元素的大小均在0-1,000,000,000之間。

第三行包含乙個整數m,為要詢問的給定值個數。1 <= m <= 10000。

接下來m行,每行乙個整數,為要詢問最接近元素的給定值。所有給定值的大小均在0-1,000,000,000之間。

輸出m行,每行乙個整數,為最接近相應給定值的元素值,保持輸入順序。若有多個值滿足條件,輸出最小的乙個。

樣例輸入

32 5 8210

5

樣例輸出

8

5

//二分查詢函式版本1 

/*寫乙個函式,在包含size個元素的,從小到大排序的int陣列a中查詢

元素p,如果找到,返回元素下標,如果找不到,則返回-1,要求複雜

o(log(n))*/ 

int binarysearch(int a,int size,int p)

else if(p>a[mid])

}return -1;

} //複雜度o(log(n)) 

//二分查詢函式版本2

/*寫乙個函式lowerbound,在包含size個元素的,從小到大排序的int陣列a裡

查詢比給定整數p小的,下標最大的元素,找到返回其下標,找不到返回-1*/

int lowerbound(int a,int size,int p)

else

}return lastpos;

}

#include

using

namespace std;

#define

maxn

(100100

)int num[maxn];

intmain

()if

(x>=num[n])

while

(l<=r)

else r=mid-1;}

if(abs(num[l]-x)<

abs(num[r]-x))

ans=l;

else ans =r;

cout<}return0;

}

演算法之二分查詢

二分查詢演算法是運用分治策略的典型例子。給定一組已經排好序的n個元素a n 從這n個元素中找到乙個特定元素x。基本思想 將n 個元素劃分成個數大致相同的兩部分,取中間元素a n 2 與x進行比較 如果x a n 2 即找到x,演算法終止 如果x如果x a n 2 則只在陣列a的右半部分繼續查詢x。c...

演算法之二分查詢

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想,每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到想要查詢的元素,或是區間被縮小為0。二分查詢的時間複雜度為o l ogn o logn o logn l og nlogn logn 是乙個非常恐怖的數量級,即使n非...

演算法之二分查詢

模板 二分查詢模板 intbinarysearch int a,int left,int right,int target return 1 解決 尋找有序序列第乙個滿足條件的元素的位置 問題的模板 二分區間 left,right 必須覆蓋解的所有可能取值 intsolve int left,int...