第二章作业
1、对二分法思想的体会
二分法看似简单,却可以解决许多难题,例如分派问题等等。它是运用分治策略的一个例子,其基本思想就是将n个元素分成个数大致相同的两半,取a[n / 2]与x作比较。如果x = a[n / 2],则找到x,算法终止;如果x < a[n /2],则只在数组a的右半边继续搜索x。整个算法时间复杂度为O(logn)。
该代码为记录次数的二分查找(循环):
int BS(int a[],int x, int n){ int l = 0; int r = n - 1; int count = 0; while(l <= r){ count ++; int m =(l + r) / 2; if(x == a[m]) { cout << m <<endl << count; return m; } if(x > a[m]){ l = m+1; } else { r = m-1; } } cout << "-1" <<endl << count; return -1; }
该代码为记录次数的二分查找(递归):
int BS(int a[], int x, int l, int r, int &count){ count ++; if(l == r){ if(x == a[l]) return l; else return -1; while(l < r){ int m = (l + r) / 2; if(x == a[m]) return m; if(x < a[m]) return BS(a, x, l, m-1, count); if(x > a[m]) return BS(a, x, m+1, r, count); } } }
对于其他的二分法的变形,有可能有难度,但是只要掌握了原理最后都会迎刃而解。
2、结对编程情况汇报
我与我的小伙伴詹泽伟同学在编程中相处融洽,有时我想破脑壳都没debug,他一眼就看出来了,团队的力量还是强大的,为我的小伙伴点赞!下次还可以一起打更难的题!