浅谈对二分思想的理解

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

猜你喜欢

转载自www.cnblogs.com/CYUCHUN/p/9831364.html