相信大家一定都學過二分演算法,沒學過的gun回去重學。
那麼今天來學習一下他的弟弟,三分。
三分法適用於求凸型函式的雞汁極值。不知道函式是什麼的可以洗洗睡了先好好學習數學。
而二次函式就是乙個典型的例子。
如圖所示
三分所求的,就是這個二次函式與圖中虛線的交點的函式值。
那麼怎樣求這個值呢,二分法顯然是不行的,因為這個函式不具備單調性(並且有時精度不夠),所以二分法的兄弟演算法「三分」也就誕生了,duang duang duang
首先,我們設當前的求解區間為[ l , r ],看起來與二分完全一樣極其相似,但是它既然叫做「三分」那麼聰明的小朋友肯定已經知道了,我們要將這段區間均分成三份。
我們需要兩個mid來存點
m1=l+(r-l)/3
m2=r-(r-l)/3 或者 l+(r-l)/3*2
如圖所示
接下來我們計算這兩個點的函式值 f(m1) , f(m2) 。
比較這兩個函式值的大小,我們稱函式值更大的那個點m2為好點(僅適用於樣例,求最大值或最小值由題目來定)。
根據好人必須死法則,他成功的沒有存活下來。
而另乙個點「壞點」m1則憑藉頑強的小強精神活了下來。
因為最優點必定更靠近好點,否則他就不是好點了。
我們可以推出,最優點一定在m1 和 r 之間。
此時,我們的求解區間從[ l , r ] ,變成了 [ m1 , r ]。
如圖
以此類推,根據最終的終止條件,我們可以求出函式的極值的近似值(必須定乙個精度)(不排除有精確值)。
**如下
#include#include不喜歡的話也昧著良心推薦一下吧!!!!#include
#include
#include
#include
#include
using
namespace
std;
inline
int min(int a,int b)
inline
int max(int a,int b)
inline
intrd()
inline
void write(long
long
x)double
a,b,c;
double f(double x)//
求函式值
intmain()
cout
/輸出結果 有時需要輸出函式值或保留小數字數 一定要注意
return0;
}
二分 三分模板
適用於 單調函式 單調增或單調減 基本思想 給定9個數,由小到大排列,從這9個數中找出某乙個確切的數 比如4 偽 int binary sreach int a,int left,int right,int x if a left x return left return 1 給你三個陣列a,b,c...
二分和三分
三分二分,乙個簡單而神奇的演算法,可以簡化時間複雜度,但是用二分有乙個條件,就是我們進行二分的序列必須有單調性。原理 aa中找乙個數x xx 保證x xx一定存在 我們可以用樸素演算法,直接從頭到尾找一遍,時間複雜度o n o n o n 如果當序列a aa的長度十分大時,這種方法就不好用了。二分橫...
二分和三分
二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...