[英]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
時必須決定這個范圍。 它不能找到“的第一個值x
與F(x)>=y
”對於任意 x,但只有在給定的范圍內任意x。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.