從二分逼近領略計算科學的魅力

2021-07-09 09:06:22 字數 1359 閱讀 6702

計算分兩種:

數學家們的方法(傾向於給出解析解),

計算機科學家的方法(設計演算法,重複的操作交給cpu)

還有一點值得說明的是:

比如 1+2

+⋯+100

的計算,高斯(等差數列的方法 (s

n+sn

)/2 ,乙個前

n 項和為順序,sn

=1+2

+⋯+100

,第二個為逆序,sn

=100+99

+⋯+1

)之後,幾乎每乙個小孩都知道該怎麼做,然而呢,我認為,這並(找規律)非計算機的做法,計算機的做法自然是簡單的迴圈遍歷相加。類似的例子見三個瓶蓋能換一瓶水,問100個人需要喝水,最少需要買多少瓶水即可解決100人的喝水問題(這篇文章提供了兩種思路,一種是找規律型的,這是人的智慧型或者思考問題的方式,一種是計算機的工作方式)。

比如針對實數域上的函式 f(

x),如果存在實數 x0

使得 f(

x0)=

0 ,則 x=

x0是函式 f(

x)的零點。如果函式 f(

x)是連續函式,且在區間 [x

1,x2

] 上是單調函式,只要 f(

x1)f

(x2)

<

0 ,就說明在區間 [a

,b] 內一定有零點,此時就可使用二分逼近法近似地找到這個零點。這種情況下,可按如下流程實施二分逼近法:

從上述過程可以看到,每次運算之後,區間範圍縮小一半,呈現線性收斂速度。設方程為 f(

x)=2

x2+3.2x−

1.8 ,求根精度為 ϵ=

10−9 ,在[−

0.8,

0.8]

尋找其根;

typedef

double (*funcptr) (double);

const

double epsilon = 1e-9;

return m;

}

既然以精度(precision)設限,其實迭代次數是與解的位置無關的,而與精度直接相關,本例精度 ϵ=

10−9 ,採用二分法的形式 229

<109

<230

,迭代次數應當在30次左右。

二分逼近求解實數的平方根的應用例項,請見 平方根的計算(二分逼近、牛頓拉普生法) 。

二分查詢的左右逼近法

普通的二分查詢用於尋找排序陣列中的某個數的位置,但是如果陣列中該數存在很多個的話,可能就無法得到確定的位置。有時候你就可能需要從左或者從右的逼近。def wfind num nums,target high len nums 因為需要邊界條件鑑別是否找到 low 0while low high mi...

二分查詢時間複雜度的計算

時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...

二分查詢時間複雜度的計算

時間複雜度無非就是while迴圈的次數!總共有n個元素,漸漸跟下去就是n,n 2,n 4,n 2 k,其中k就是迴圈的次數 由於你n 2 k取整後 1 即令n 2 k 1 可得k log2n,是以2為底,n的對數 所以時間複雜度可以表示o o logn 二分查詢的時間複雜度是o log n 最壞情況...