一、对二分法思想的理解
1.特点:又称为折半算法,是分治策略的一个典型例子。主要是用于:在已排好序的n个元素组成的数组a[0:n-1]中,找出一个特定的元素x。
2.基本思想:(1)将n个元素分成个数大致相同相同的两半,然后取a[n/2]与x作比较。
(2)如果x = a[n/2],则已找到x,返回下标并结束算法;
如果x < a[n/2],则只在数组a的左半部继续搜索x;
如果x < a[n/2],则只在数组a的右半部继续搜索x;
3.时间复杂度:在二分搜索算法中,x每进行比较,待搜索的数据范围就折半一次,直到找到x;
最坏情况为数组中没有x,则x需进行log n次比较,此时二分搜索算法的时间复杂度为O(log n);
最好情况为x为数组最中间的值,即x只需进行一次比较,此时二分搜索算法的时间复杂度为O(1);
4.空间复杂度:在二分搜索算法中,只需要n个空间用于存放n个元素组成的数组a,无需其余辅助空间,所以二分搜索算法的空间复杂度为O(1);
5.优点:时间复杂度小,可用于数据量较大的情况。
6.缺点:只可用于一事先排好序的数组。
7.实现算法
(1)循环
int BinarySearch(int a[],int x,int n) { int left = 0,right = n-1; while(left <= right) { int middle = (left+right)/2; if(x == a[middle]) return middle; if(x < a[middle]) right = middle - 1; else left = middle + 1; } return -1; }
(2)递归
int BinarySearch(int a[],int left,int right,int x) { int middle = (left + right) / 2; if(x = a[middle]) return middle; if(x < a[middle]){ BinarySearch(a,left,middle-1,x); } else{ BinarySearch(a,middle+1,right,x); } return -1; }
二、结对编程情况汇报
跟partner结对至今,我们总共开展了两次合作讨论。
第一次合作是讨论pintia上的“第二章作业”。刚开始时,我们对于选择题第7、12和15题的答案都是有点迷茫的,所以我们重点针对这些题目查找一些相关的资料并展开讨论,在经过多次讨论之后,我们最终成弄懂这些题目的含义并算出正确的答案。
第二次合作是共同完成pintia上的“第二章实践”,由于我partner在课前已事先完成了这些题目,所以在课上,主要是我负责在思考解题方式和敲代码,而我partner主要负责在旁边忙纠错。三道题完成后,我们俩针对如何采用二分法解决第三题这个问题展开了讨论,并得出了解法的基本思想,但还有许多细节有待继续讨论。
总而言之,这次个partner的结对编程在一定程度上拓宽了自身的解题思维,也帮助自己更好地去套用每一个算法。
原文地址:https://www.cnblogs.com/wanna-acm/p/9813927.html