• 二分查找


    二分查找的高效在于,每一步都可以去除当前区间中的一半元素,因此这种算法的时间复杂度是$O(logn)$

    二分的前提是该序列是有次序的,例如递增或递减

    //序列中是否存在满足某条件的元素
    int binarySearch(int A[],int left,int right,int x)
    {
        int mid;
        while(left<=right)  //作为元素不存在的判定原则,因此left<=right满足时应当一直执行,当left>right是则不再是闭区间
            { 
                mid = left+(right-left)/2; //避免left+right溢出范围 
                if(A[mid] == x) 
                   return mid; 
                else if(A[mid] > x)
                   right = mid-1;
                else if(A[mid] < x)
               left = mid+1; 
        }
        return -1;     // 返回-1表示查找失败 
    }
    int lower_bound(int A[],int left,int right,int x)
    {
        int mid;
        while(left<right)
            {
            mid = left+(right-left)/2; //避免left+right溢出范围 
            if(A[mid] >= x)  // 返回第一个大于等于x的元素的位置 
            right = mid;
        else
            left = mid+1; 
        }
        return left;     // 此时left==right,即应该存在的位置 
    }
    int upper_bound(int A[],int left,int right,int x) // 返回第一个大于x的元素的位置 
    {
        int mid;
        while(left<right)
        {
            mid = left+(right-left)/2;  //避免left+right溢出范围 
            if(A[mid] <= x) 
                        left = mid+1; 
                    else
                right = mid; 
        }
        return left;     // 此时left==right,即应该存在的位置 
    }

    如果想要找最后一个满足条件A的元素的位置,则可以先求第一个满足条件!A的元素的位置,然后再减一。

  • 相关阅读:
    mysql免安装版配置+navicat测试
    查询SQL Version详细信息
    拆分数据库测试之--收缩数据库
    测试拆分比较大SQL Server数据库
    SQL捕捉blocking信息
    T-SQL 重复读(Double Read)问题的理解
    Node.js版-七夕无事,人艰勿拆,求别说...
    css实现三角箭头(兼容IE6)
    前端开发的基础知识点摘要
    jQuery原理系列-常用Dom操作
  • 原文地址:https://www.cnblogs.com/kachunyippp/p/10256471.html
Copyright © 2020-2023  润新知