二分檢索用途及複雜性 二分搜尋演算法

2021-10-16 21:56:18 字數 2927 閱讀 8178

介紹

在電腦科學中,二分搜尋(英語:binary search),也稱折半搜尋(英語:half-interval search)、對數搜尋(英語:logarithmic search),是一種在有序陣列中查詢某一特定元素的搜尋演算法。搜尋過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜尋過程結束;如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。如果在某一步驟陣列為空,則代表找不到。這種搜尋演算法每一次比較都使搜尋範圍縮小一半。

時間複雜度和空間複雜度

時間複雜度

二分搜尋在最壞情況下的複雜度是對數時間,進行o(logn) 次比較操作,n在此處是陣列的元素數量。最好情況下o(1).

空間複雜度

如果迭代實現二分搜尋則空間複雜度為o(1),如果遞迴實現空間複雜度為o(logn)。無論對任何大小的輸入資料,演算法使用的空間都是一樣的。除非輸入資料數量很少,否則二分搜尋比線性搜尋更快,但陣列必須事先被排序。儘管特定的、為了快速搜尋而設計的資料結構更有效(比如雜湊表),二分搜尋應用面更廣。

**實現

最原始的模板

#include

#include

using namespace std;

int main()

int nums[5] = ;

int target = 0;

int left = 0,right = 4;

int ans = -1;

printf("請輸入target:");

scanf("%d",&target);

while(left <= right)

int mid = (left+right)/2;

if(nums[mid] == target)

ans = mid;

break;

else if(nums[mid] > target)

left = mid+1;

else if(nums[mid] < target)

right = mid-1;

printf("%d",ans);

return 0;

注意:結束條件是left <= right

查詢第乙個與key相等的元素

int binarysearch(vector& nums,int target)

int left = 0,right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] >= target) right = mid-1;

else left = mid+1;

if(left >= 0 && left < nums.size() && nums[left] == target) ret.push_back(left);

return -1;

查詢最後乙個與key相等的元素

int binarysearch(vector& nums,int target)

int left = 0;right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] <= target) left = mid+1;

else right = mid-1;

if(right >= 0 && right < nums.size() && nums[right] == target) ret.push_back(right);

return -1;

查詢最後乙個等於或者小於key的元素

int binarysearch(vector& nums,int target)

int left = 0;right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] > target) right = mid-1;

else left = mid+1;

return right;

查詢最後乙個小於key的元素

int binarysearch(vector& nums,int target)

int left = 0;right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] >= target) right = mid-1;

else left = mid+1;

return right;

查詢第乙個等於或者大於key的元素

int binarysearch(vector& nums,int target)

int left = 0;right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] >= target) right = mid-1;

else left = mid+1;

return left;

查詢第乙個大於key的元素

int binarysearch(vector& nums,int target)

int left = 0;right = nums.size()-1;

while(left <= right)

int mid = left+(right-left)/2;

if(nums[mid] > target) right = mid-1;

else left = mid+1;

return left;

相關題目

二分檢索用途及複雜性 二分搜尋技術的時間複雜度

二分搜尋法,它充分利用了元素間的次序關係,採用分治策略,可在最壞的情況下用o log n 完成搜尋任務。在電腦科學中,二分搜尋 英語 binary search 也稱折半搜尋 英語 half interval search 對數搜尋 英語 logarithmic search 是一種在有序陣列中查詢...

二分檢索歸納

二分法搜尋並不是什麼很高深的演算法,任何時候需要編寫乙個這樣的演算法恐怕都不是難事,甚至c 標準庫里已經有相關數但是當現在的我看到二分法搜尋的 仁需要想一想是否確實是這樣寫的時候,我就知道我應該要寫一篇這樣的總結,把我對二法這個說難不難的問題梳理歸納一下,這樣即使以後忘記了也能夠比較完整地回憶起這方...

Java 二分搜尋 二分查詢

對陣列元素進行逐個查詢顯然是費時費力的工作,我們可以使用一些方法快速地搜尋出陣列中元素的指定位置.接下來我們介紹一種方法 二分搜尋法 二分搜尋法充分利用了元素間的次序關係.基本思想 將n元素分成個數大致相同的涼拌,取arr n 2 與欲查詢的x做比較,如果 下面將採用兩種方式 遞迴 非遞迴 來展示二...