簡體   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