二分的弟弟「三分」

2022-04-28 18:09:10 字數 1514 閱讀 3872

相信大家一定都學過二分演算法,沒學過的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的長度十分大時,這種方法就不好用了。二分橫...

二分和三分

二分 二分,即為折半查詢,它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。也就是說,二分的條件為必須滿足數列或某一邏輯的順序性,單調 只有這樣才能進行二分。查詢方法 首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如...