c++ - 如何在 C++ 中实现对函数的二分查找?

标签 c++ algorithm

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

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

我需要找到那个点。


我需要做的是从x=1 开始的二分搜索 (这样它甚至不会触及 x 接近 n 的耗时区域)。


现在,我正在手动执行二进制搜索实现,我从函数的最小值开始(因此,f(1),这是错误的)。然后我将输入值加倍,直到达到 f(x) is happy 的状态(真的)。这部分没什么大不了的。我可以手动完成。

接下来,我想在 [x/2,x] 范围内对 first 值进行二分搜索,其中 f(x) = true (注意 f(x/2) 必须等于 false,因为 f(1) = false ...我需要在不犯任何错误的情况下完成它。而且是事情变得有点毛茸茸的地方。


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

相反,它似乎是贪婪的:它只会捕获第一个 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(...)是之前的 bool 函数...

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

最佳答案

您可以实现一个自定义迭代器,根据它表示的索引“指向”真或假,并使用 std::lower_bound查找第一个 true 值的函数。

关于c++ - 如何在 C++ 中实现对函数的二分查找?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43009412/

相关文章:

javascript - 如何使用 jQuery 将 if 条件添加到 append() 中

arrays - 从迭代器内的对象中删除元素的最佳方法是什么?

javascript - 对于正则表达式模式,如何确定与该模式匹配的最长字符串的长度?

C++11 交叉编译器/标准库随机分布再现性

c++ - std::stod 没有给出确切的数字输出

c++ - 使用 Lambda 和递归函数调用了解 QTimer

c++ - 从 Boost.Spirit 中的固定列表中解析选择

c++ - C++ 和 Python 中的 for 循环

算法题: Converting non-integer maximum flow to integer maximum flow

c++ - 在二维数组中查找图形的边界