二分三分法 (一)

二分查找算法

简单定义:
在一个单调有序的集合中查找元素,每次将集合分为左右两部分,判断解在哪个部分中并调整集合上下界,重复直到找到目标元素。
时间复杂度:
O (logn),优于直接顺序查找O(n)

这里也补充一下算法速度的表示方法:
指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度):
O(1)表示常数阶时间复杂度
O(log n),也叫对数时间复杂度,这样的算法包括二分查找。
O(n),也叫线性阶时间复杂度,这样的算法包括简单查找。
O(n * log n), (n*对数复杂度)
O(n^2),平方阶时间复杂度
O(n!),阶乘阶时间复杂度
简单理解就是画出上述的各种函数图像,很明显logn最小!!

最近看了一些相关的资料加上自己的心得体会,对于二分进行相关的总结:
目的:二分查找的中心思想就是查找所需要的结果,也就是说给定一个数组和目标值,返回该目标值在数组中第一次出现的位置。
限制:也就是说二分查找的有的条件,①该数组必须满足顺序存储结构,②该数组必须按关键字的大小有序排列。
优点:时间复杂度特别小,适用于大数据的情况下。
直接上最基本原理的代码:

//x:待查找的元素, n:数组集合大小, num数组单调递增
    int low=0,high=n,mid,res = -1;  //low:集合下界 high:集合上节
    while(low<=high)                     
    {
        mid=(low+high)/2;   //mid:将集合分割为两部分
        if(num[mid]==x)	 //查找到符合元素x
        {
           res = mid;
	   break;	           
        }        
        else if(num[mid]<x)//x在右边部分,调整集合下界
           low=mid+1;
        else		     //x在左边部分,调整集合上界
           high=mid-1;
    }                     //若未找到x,则res = -1
     //x:待查找的值,Caculate():所要查找的函数,在这里单调递增
     //需保证查找的值在区间范围内
    double low=“区间下界”,high=“区间上界”,mid;
    while(high - low > 1.0e-6)
   {
	 mid = (high + low)/2;
     if(Caculate(mid)<x)
        low=mid;
     else
        high=mid;
   }

关于二分法更多的就是二分法的拓展,最典型的就是是二分法但是决不让你知道用二分来做,下次写博客的时候争取可以多总结一些二分法的题型,更加深入了解二分法的概念。
“宝剑锋从磨砺出,梅花香自苦寒来。”

发布了90 篇原创文章 · 获赞 15 · 访问量 3139

猜你喜欢

转载自blog.csdn.net/qq_43656233/article/details/89505560
今日推荐