二分和三分的学习笔记
我确实很菜的啦,竟然还去百度了二分和三分有什么区别,也算知道了
二分用于单调函数寻找某个值,必须是单调的,而三分就用于单峰函数求极值
总归,二分就好像很暴力的找出某一个值,但是三分更像是在找一个单峰函数的极值(最优解);
二分模板奉上:(写的时候在main和全局都开了一个数组。。。调试了好久啊。。。)
ll er_fen(ll p,ll left,ll right){ ll l = left,r = right,mid; while(l < r){ printf("%lld %lld\n",l,r); mid = (l + r)/2; if(a[mid] > p) r = mid-1; else if(a[mid] < p) l = mid + 1; else return mid; } return l;//这里返回的是下标 }
下面,奉上三分模板:
double cal(){}//既然是求最优值,那么有的时候就是小数,所以用double while(l + eps < r){//浮点数的比较 lmid = l + (r-l)/3; rmid = r - (r-l)/3; //或者 lmid = (2*l + r)/3,rmid = (l + r*2 + 2)/3; v1 = cal(lmid); v2 = cal(rmid); if(v1 < v2) l = lmid; else r = rmid; }
好的做几道题。。。(虚的一批啊我)