欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class15 二分法 lcy

时间:2024-07-25 09:06 作者:admin 点击:
递推、递归、二分、贪心、倍增 二分法: 是一种在有序数组中查找特定元素的搜索算法。 前提是有序 搜索过程是从中间开始,如果中间值恰好是目标值,那么搜索结束。 如果目标大

递推、递归、二分、贪心、倍增


二分法:

是一种在有序数组中查找特定元素的搜索算法。

前提是有序

搜索过程是从中间开始,如果中间值恰好是目标值,那么搜索结束。

如果目标大于或小于中间值,则在数组的大于或小于中间值的一半去找,减少寻找范围。

1~100

中间值 50 如果50大了 那么目标就是1~50

中间值 25 如果25小了 那么目标就在25~50

直到找到中间值

------------------------

#include <iostream>

using namespace std;

int main(){

   int n,x;

   cin>>n;

   for(int i=0;i<n;i++){

       cin>>a[i];

   }

   cin>>x;

   //假设当前有序,

   int l=a[0],r=a[n-1];

   while(l<r){

       int m=(l+r)/2;

       if(a[m]==x) {

           cout<<m;

           return 0;

       }

       else if(a[m]>x) r=m-1;

       else if(a[m]<x) l=m+1;

   }

   cout<<-1;

   return 0;

}


   1、初始化:找到数组的最小值和最大值

   int low=a[0],high=a[n-1];

   2、找中间值:

   int mid=(low+high)/2;

   3、比较:

       相等:找到了

       目标值较大:去掉一半

       目标值较小:去掉一半

   4、循环2-3步,直到相等

   5、如果找到了,输出答案,否则输出-1


二分法的时间复杂度:

最优情况:O(1),恰好在中间,一次就可以找到

平均和最坏情况:O(logn),n指元素的数量

log16在c++里指2^?=16  ?=4  如果有16个数字,那么需要找4次可以找到

如果n=100需要多少次?2^6=64 <= 100 <= 2^7=128 所以找100个数字要7次

如果n=1000需要多少次?10次


基础算法:第七章分治算法的题

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%