計算分兩種:
數學家們的方法(傾向於給出解析解),
計算機科學家的方法(設計演算法,重複的操作交給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 最壞情況...