• 浅谈对二分思想的理解


    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++两种不同的编程语言下,对这几种算法进行编程和研究。

  • 相关阅读:
    ABP 菜单 修改
    C# 过滤器
    RabbitMQ框架构建系列(三)——Net实现RabbitMQ之Producer
    RabbitMQ系列(二)RabbitMQ基础介绍
    RabbitMQ系列(一)AMPQ协议
    MVC 解读WebConfig
    MVC过滤器特性
    asp.net中使用JQueryEasyUI
    asp.net请求到响应的整个过程
    Redis的下载安装部署(Windows)
  • 原文地址:https://www.cnblogs.com/CYUCHUN/p/9831364.html
Copyright © 2020-2023  润新知