二分法,二分搜索
二分法是一个应用很广泛的算法(好吧,刚说出这句话的时候,我查了一下资料,发现我了解的应用寥寥无几........)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; }
待续.......

浙公网安备 33010602011771号