数学函数的二进制搜索
Binary search for math function
我有一个递增的数学函数,例如y = x + 5*x^3 + x^7 + 11*ln x
,我想找到第一个(正)x
,这样y(x) >= 1478
。我可以使用stl的二进制搜索算法来解决这个问题吗?
问题是,STL算法(std::lower_bound
可能是您选择的候选算法)对集合有效。或者更具体地说:在集合的迭代器上。使用它们解决问题的一种方法是使用适配器:编写一个"迭代器",它只需在解引用时返回函数值。
这方面的代码可能相当大,因为您需要满足RandomAccessIterator的所有要求。但是,您可以在函数中对其进行模板化。示例:
template<class F>
FuncIterator{
typedef int ParamType;
typedef float ResultType; // Or better: result_of F
ParamType param_;
FuncIterator(ParamType param): param_(param){}
ResultType operator*(){ return F(param_); }
FuncIterator& operator+=(int diff){ param_ += diff; return *this; }
//... Other functions required for RandomAccessIterator
}
auto result = std::lower_bound(FuncIterator<MyFunc>(0), FuncIterator<MyFunc>(1000));
std::cout << "First x value is:" result.param_ << std::endl;
再次强调:迭代器比这里显示的更复杂,但您应该从这里了解更多。你需要一些定义和可能的特征。但是您只需要定义一次它,并且可以将它用于任何函数。如果您使用std特性来推断参数的类型和F
的结果,它会变得更通用。
最后一点:二进制搜索只搜索一个范围!因此,在调用std::lower_bound
时,您必须决定这个范围。对于anyx,它找不到"具有F(x)>=y
的第一个值x
",但仅针对给定范围内的任何x。
相关文章:
- 有根的二进制搜索树.保留与其父级的链接
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 二进制搜索树叶数问题
- 为什么二进制搜索在我的测试中不起作用
- 正在尝试重载二进制搜索树分配运算符
- 我的二进制搜索程序只是关闭了
- 二进制搜索的终止点
- 递归二进制搜索与字符串数组
- 测试树是否为二进制搜索树
- 如何二进制搜索结构向量并在适当的索引处插入
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 字符串的递归二进制搜索-C++
- 使用二进制搜索树中的迭代器对象访问左侧节点
- 二进制搜索树没有匹配的函数调用
- 二进制搜索不适用于特定输出
- 如何在向量上进行二进制搜索以找到具有特定id的元素
- 二进制搜索树不变的标头文件
- 二进制搜索树插入带参数参考
- 二进制搜索不变以查找元素的首次出现
- 了解一种神秘地起作用的递归二进制搜索算法