如何在C ++中实现函数的二进制搜索?

时间:2017-03-24 21:27:29

标签: c++ algorithm

我在C ++中遇到过一个代价高昂的子问题:近一分钟。此外,这个子问题 - bool f(x) - 变得更长,因为x的范围是[1,n]。

在[1,n]的范围内,有一个点1<j<n, f(j) = truef(k), k < j 始终为假 ... f(m), j < m总是真的

我需要找到这一点。

我需要这样做的方法是从x=1开始使用二进制搜索(这样它甚至不会触及耗时的区域,其中x接近n)。

现在,我正在手动浏览二进制搜索实现,其中我从一个函数的最小值开始(所以,f(1),这是假的)。然后我将输入值加倍,直到达到f(x) is happy(true)的状态。这部分没什么大不了的。我可以手动完成它。

接下来,我想在{x / 2,x]范围内对第一个值进行二分搜索,其中f(x) = true(注意f(x/2)必须等于false,因为f(1) = false ......我需要做到这一点而不会犯任何错误。这个就是事情​​变得有点毛茸茸的。

所以我怀疑C ++已经实现了这一点,但我是C ++的新手,并且对库的经验有限。我目前正在研究二分搜索,但是我没有看到一种方法来搜索函数的所有值从false变为true的实际点。

相反,它似乎是贪婪的:它只会抓住它找到的第一个true,而不是最小的true

我如何在C ++中执行此操作?

我的搜索功能的输入如下:

std::vector<int> range(max);
for (int j = 0; j < max; j++){
    range[j] = j;
}

std::some_search_function(range.begin(),range.end(),f(int value))

其中f(...)是之前的布尔函数...

它需要具有我所描述的属性:从它正在搜索的项目中的第一个值开始,并返回满足f(...)的最早项目...

1 个答案:

答案 0 :(得分:3)

你可以实现一个自定义迭代器,它可以指向&#34;指向&#34;根据它所代表的索引使用true或false,并使用std::lower_bound函数查找第一个true值。