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