描述一个 O(log n) 分治算法来解决单调递减函数问题

问题描述

在这个问题中,我们考虑一个单调递减的函数 f:N → Z(即定义在返回整数值的自然数上的函数,使得 f(i) > f(i + 1))。假设我们可以在常数时间 O(1) 内评估任何 i 处的 f,我们想要找到 n = min{i ∈ N | f(i) ≤ 0}(即我们要找到 f 变为负的最小值)。

graph of monotonously decreasing function

我们显然可以通过评估 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;