zoukankan      html  css  js  c++  java
  • 二分搜索技术

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

    给定已排好序的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)。

  • 相关阅读:
    SqlServer_小工具_时间格式化
    SqlServer_小工具_字符填充(左)
    SqlServer_小工具_获取北京时间
    JS写入Json到CSV并下载
    写入数据到CSV
    写入数据到Excel
    批量插入数据
    Json填充Object工具
    Json|XMl|Object互相转化-小工具
    TODO:用python实现aws签名
  • 原文地址:https://www.cnblogs.com/xjtuchenpeng/p/5479752.html
Copyright © 2011-2022 走看看