我在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
(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(...)
的最早项目...
答案 0 :(得分:3)
你可以实现一个自定义迭代器,它可以指向&#34;指向&#34;根据它所代表的索引使用true或false,并使用std::lower_bound
函数查找第一个true
值。