• 二分搜索技术


    二分搜索算法上运用分治策略的典型例子。

    给定已排好序的n个元素a[0...n-1],现在要在这n个元素中找出一特定元素x。

    首先想到的是用顺序搜索方法,逐个比较a[0...n-1]中元素,直至找出元素x或搜索整个数组后确定x不在其中。这个算法没有很好利用n个元素已排好序这个条件,因此在最坏情况下,顺序搜索方法需要O(n)次比较。

    二分搜索方法充分利用了元素间的次序关系,采用分治策略,可在最坏情况下用O(logn)时间完成搜索任务。

    二分搜索算法的基本思想是将n个元素分成个数大致相同的两半,取a[n/2]与x进行比较。如果x = a[n/2],则找到x, 算法终止。如果x<a[n/2],则只要在数组a的左半部继续搜索x。如果x>a[n/2], 则只要在数组a的右半部继续搜索x。

     1 #include<stdio.h>
     2 
     3 int binarySearch(int *a, int x, int n)
     4 {
     5     int left = 0;
     6     int right = n - 1;
     7     while(left <= right)
     8     {
     9         int middle = (left + right) / 2;
    10         if(x == a[middle])
    11             return middle;
    12         if(x > a[middle])
    13             left = middle + 1;
    14         else
    15             right = middle - 1;
    16     }
    17     return -1;
    18 }
    19 
    20 int main(void)
    21 {
    22     int a[6] = {1, 2, 3, 4, 5, 6};
    23     int x;
    24 
    25     scanf("%d", &x);
    26     if(binarySearch(a, x, 6) != -1)
    27         printf("Find");
    28     else
    29         printf("No");
    30 
    31     return 0;
    32 }

    容易看出,没执行一次算法的while循环, 待搜索数组的大小减少一半。 因此, 在最坏情况下, while循环被执行了O(logn)次。 循环体内运算需要O(1)时间, 因此,整个算法在最坏情况下的计算时间复杂度为O(logn)。

  • 相关阅读:
    Phoenix SQL总结
    awk基本用法
    集群性能调优-速度篇
    集群基准性能测试
    服务器基础环境搭建
    kafka命令行操作
    九、spring boot--JPA实现分页和枚举转换
    八、spring boot--mybatis框架实现分页和枚举转换
    七、spring boot开发web应用--mybatis-plus框架实现分页和枚举转换
    六、spring boot开发web应用--mybatis-plus为简化而生
  • 原文地址:https://www.cnblogs.com/xjtuchenpeng/p/5479752.html
Copyright © 2020-2023  润新知