zoukankan      html  css  js  c++  java
  • 浅谈对二分思想的理解

    1、什么是二分思想?

    二分思想可以理解为是一种将一个大问题分成两个子题,当每次分析完两个子问题后,舍弃其中一个不符合条件的子问题,再将符合条件的子问题一分为二,反复循环搜索判断的操作,直至找到所求的数值或者子问题不能再一分为二时为止的思想。

    2、二分搜索算法

    二分搜索算法是运用二分思想和分治策略的典型例子。

    问题描述:给定已排好序的n个元素a[0: n-1],现要在这n个元素中找到一特定元素x,找到x时返回其在数组中的位置,否则返回-1

    3、二分思想代码实现

    以上述二分搜索问题作为例子

    非递归:

     1 int BinarySearch(int a[], int x, int n) 
     2 {
     3     int left = 0;
     4     int right = n -1;
     5     While(left <= right) {
     6         int middle = (left + right)/2;
     7         if(x == a[middle]) return middle;
     8         if(x > a[middle]) left = middle + 1;
     9         else right = middle -1; 
    10     }
    11     return -1;//未找到x,返回-1 
    12 }

    递归:

     1 int BinarySearch(int a[], int left, int right, int x) 
     2 {
     3     int middle;
     4     middle = (left + right)/2; 
     5     if(left > right) return -1;//数组为空
     6     if(left == right) {//数组只有一个元素
     7         if(x == a[left]) return left;
     8         else return -1;//未找到x
     9     }
    10     if(x == a[middle]) return middle;
    11     else if(x < a[middle]) return BinarySearch(a, left, middle-1, x)
    12     else return BinarySearch(a, middle+1,right, x)
    13 }

     

    4、该二分搜索算法时间复杂度分析

    非递归算法时间复杂度:每执行一次循环,待搜索的数组的大小就减少一半。因此在数组长度为n的最坏情况下,while循环被执行了O(logn)次,而循环体内运算需要O(1)时间,故整个算法在最坏的情况下的时间复杂度为O(logn)。

    递归算法时间复杂度:根据分治法的思想,将原问题分成两个子问题,即T(n)=2T(n/2) + f(n),而总的长度为n,合并起来的时间复杂度为f(n) = O(n),因此,整个算法的时间复杂度为T(n)=2T(n/2) + O(n) = O(logn)。

     

    5、结对编程情况汇报

    和两个小伙伴一起讨论和分析了算法课本第二章的几个重要算法,如二分搜索算法、合并排序、快速排序等等。我们分别从递归和非递归入手,想要从两个不同的算法形式中探讨几个算法的时间复杂度,讨论过程中的思维碰撞让人受益匪浅。由于有一个小伙伴是来自信管专业的,我们又从java和c++两种不同的编程语言下,对这几种算法进行编程和研究。

  • 相关阅读:
    grpc源码分析之域名解析
    使用swig工具为go语言与c++进行交互
    使用VS2015编译grpc_1.3.1
    在linux中编译grpc
    win32网络模型之重叠I/O
    滚动动画animate-scroll扩展
    Android Studio Gradle更新的解决办法
    MUI——页面的创建、显示、关闭
    VS2013中使用QT插件后每次重新编译问题
    Oracle Rman恢复
  • 原文地址:https://www.cnblogs.com/CYUCHUN/p/9831364.html
Copyright © 2011-2022 走看看