繁体   English   中英

二进制搜索数学函数

[英]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 traits来推断param的类型和F结果,它会变得更通用。

最后说明:二进制搜索仅搜索范围! 所以你在调用std::lower_bound时必须决定这个范围。 它不能找到“的第一个值xF(x)>=y ”对于任意 x,但只有在给定的范围内任意x。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM