问题描述
在这个问题中,我们考虑一个单调递减的函数 f:N → Z(即定义在返回整数值的自然数上的函数,使得 f(i) > f(i + 1))。假设我们可以在常数时间 O(1) 内评估任何 i 处的 f,我们想要找到 n = min{i ∈ N | f(i) ≤ 0}(即我们要找到 f 变为负的最小值)。
我们显然可以通过评估 f(1),f(2),f(3),在 O(n) 时间内解决问题。 . . f(n)。但是我必须描述一个 O(log n) 分治算法来解决这个问题。 (提示:在 O(log n) 仔细选择的值 ≤ n 和可能在 n 和 2n 之间的几个值上评估 f。
有人可以帮忙吗?我什至不知道从哪里开始这个问题?
解决方法
首先,在 O(log n) 时间内找到一个包含目标的范围,大小为 O(n)。
int mini = 1;
int maxi = 2;
while(f(maxi)>0) {
mini = maxi+1;
maxi *= 2;
}
在[min,maxi]中进行二分查找
while(mini < maxi) {
int testi = mini+(maxi-mini)/2;
if (f(testi)<=0) {
maxi = testi;
} else {
mini = testi+1;
}
}
return mini;