二分法,二分搜尋
阿新 • • 發佈:2020-11-02
二分法是一個應用很廣泛的演算法(好吧,剛說出這句話的時候,我查了一下資料,發現我瞭解的應用寥寥無幾........)OK,既然不知道,那就下次補充把。咱們直接進入主題。
二分法(Bisection method):是一種方程式根的近似值求法。
演算法:
若要求已知函式f(x)=0的值則:
1.先找出一個區間[a,b],使得f(a)與 f(b)互為異號,根據界值定理,其解一定在這個範圍內。
2.求該區間中點m=(a+b)/2,並求出f(m)的值。
3.若f(m)y與f(a)異號,則取[a.m]為新區間,反之則取[m,b]為新區間。
4.重複2,3的步驟,直到取到理想的近似值。
以上是二分法,介紹其,是為了引出接下來要介紹的二分查詢演算法(我不會說是因為我沒分清楚他們的區別才寫的)。
二分搜尋演算法:
定義:在電腦科學中,二分查詢演算法是一種在有序陣列中查詢某一特定元素的搜尋演算法。其查詢過程類似於上面介紹的步驟。
演算法:
在一個有序數列A1,A2,A3,....... ,An中,要查詢的目標值為T,查詢步驟如下:
1.令L=0,R=n-1,如果L>R,則搜素以失敗告終。
2.令m=(L+R)/2,如果Am> T,則區間更新為[L,m],反之區間更新為[m,R]。
3.不斷執行步驟2,當Am =T時,傳回值m。
時間複雜度:O(logn), 空間複雜度:O(1)。
程式碼:
#include<bits/stdc++.h> using namespace std; const int maxn=200; int num[]={12,43,5,23,12,54,32,44,1,8,9}; bool Binary_search(int x){ sort(num,num+11); //二分查詢的前提,陣列必須是有序陣列 int l=0,r=10; while(r-l>=1){ int mid=(l+r)/2; if(num[mid]==x) return true; else if(num[mid]<x) l=mid+1; else r=mid; } return false; } int main(){ int ab;cin>>ab; if(Binary_search(ab)) cout<<"找到了"<<ab; else cout<<"沒有找到"<<ab; return 0; }
待續.......