您的位置:首页 > 其它

二分+三分模板

2016-08-01 20:44 246 查看

二分

适用于

单调函数(单调增或单调减)。

基本思想

{ 1, 2, 4, 5, 7, 9, 13,25, 37 }

给定9个数,由小到大排列,从这9个数中找出某一个确切的数(比如4)

伪代码



int binary_sreach(int a[], int left, int right, int x)
{
left = 0, right = n - 1;       /*左闭右开*/
while(left +1< right)
{
int mid = (left + right) / 2;
if(a[mid] <= x)
left = mid ;
else
right = mid;
}
if (a[left]==x) return left;
return -1;
}


例题

给你三个数组A, B, C,并给出一个X,是否能从这三个数组中找出Ai, Bj, Ck三个数,使得满足Ai + Bj + Ck = X。1<= A, B, C数组的大小 <=500

遍历时间复杂度是O(n^3),但先暴力求解出所有 Ai + Bj,然后二分查找 X – Ck 时间复杂度就是O(n^2logn)。

三分

适用于

单峰凸性函数,如二次函数

伪代码



while (right  –  left  >  exp)
{
mid1 = left + (right - left) / 3;
mid2 = right - (right - left) / 3;
ans1 = cal(mid1);
ans2 = cal(mid2);
if (ans1 < ans2)
left = mid1;
else
right = mid2;
}


重点:

比较mid1和mid2谁更靠近极值,如果mid1更靠近极值,右区间改为mid2,否则左区间改为mid1

推荐一篇博客
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: