微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决描述一个 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。