利用數學證明方式驗證程式的可靠性(一)

2021-04-16 19:31:28 字數 1946 閱讀 5838

利用數學證明方式驗證程式的可靠性(一)

在編寫後台程式的時候,我們常常利用壓力測試來驗證用於處理任務佇列的特定演算法是否存在bug。但是如果測試的壓力程度沒有達到這個bug出現的下限,因此我們經常在使用軟體的時候面臨災難。

災難不是來自我們的惰性,而是來自壓力程式的程度。

因此,在驗證程式的可靠性時候,我習慣嘗試使用數學證明方式來驗證。 在處理數學問題的時候,我們往往知道乙個數學問題得以解決的關鍵條件是什麼,也因此可以知道問題解決失敗的原因。同樣利用這種方式,可以讓我們知道程式出現bug的條件是在**。

或者換句話說,乙個程式被測試驗證是可靠的,它的條件是什麼,其不可靠的條件是什麼。

然而怎麼證明某個特定演算法的可靠性呢?

首先簡化程式,提出乙個模型。最近在工作過程中,遇到乙個這樣的問題:乙個客戶端定時向伺服器新增一串行分配給某些客戶端(c1…….cn)執行的呼叫任務,該序列呼叫任務是具有某個呼叫計畫標誌。而服務端將該呼叫計畫標誌新增到c1……cn呼叫佇列中,該呼叫佇列是乙個特定型別陣列cj_work[max]( cj_work是客戶端cj,

max 是乙個巨集)。往該陣列新增計畫呼叫標誌的條件是陣列cj_work[i].state = 0 (0<= i < max)。客戶端每次向服務端發起執行呼叫任務請求,服務端必須從該客戶端呼叫佇列提取呼叫任務給他,並幫他呼通通話的另一方。由於該操作是乙個執行緒。所以服務端檢測某個客戶端的呼叫任務是採用如下的方式:

……for(int j = 0;j < max; j++)

}……(1)

開始服務端向cj_work[max]新增任務採用如下簡單的策略:

for (int i = 0; i < max; i++)

}…(2)

通過閱讀**段 (1)、(2),很容易我們就可以發現這樣的任務。在(1)很有可能先處理後新增進來的任務(**(1)、(2)屬於不同的執行緒),更糟糕的是比較先新增進來的任務可能一直沒有被處理。

所以必須修改**(1)、(2),使其按照時間順序執行任務。我不想利用cj_work[i]中的乙個time成員,因為利用這個成員,**(1)每次檢測的時候都要對cj_work進行排序,如果使用最快的演算法也要max*log(max)。

因此我對每個cj_work,新增了乙個cj_nextpoll變數(初始為0),對**(1)、(2)做了如下的修改

int k

for(int j = 0;j < max; j++)

}…… (3)

int k;

for (int i = 0; i < max; i++)

}… (4)

通過新增了幾個變數,我們可以省去了排序(排序面臨著變數的拷貝)。 但是必須驗證這樣的修改是否符合要求(乙個簡單的方法,可以寫個測試程式),但是我想通過證明方式來驗證。

因此我把上述的驗證用乙個數學模型來描述:

對於任務j1,….,jn。按時間先後順序有ji對於(3),(4),很明顯我們可以得到對於cj_lastpoll 有:

(*) jn > jcj_nextpoll,jn 後於

jcj_nextpoll 被處理(jcj_nextpoll是cj_nextpoll對應的時間序任務)。

利用這個規則,我們可以利用反正法來證明。假如存在這樣的ji由(3),我們可以知道存在jcj_nextpoll = ji,這樣再利用(*)矛盾。

所以我們只要保證(*)永遠成立就可以。

現在我們在來分析:

對於**(3)

(1)對於任意ji,存在jcj_nextpoll = ji。

(2)對於陣列下標k, k = (cj_nextpoll + i)%max,如果i> 0,有jk 後於jcj_nextpoll被處理。jk 為陣列k下標對應的時間序任務。

對於**(4)

(3)對於任意的jk,jk > jcj_nextpoll,有

k = (cj_nextpoll + i)%max,i > 0。

綜合(1)、(2)、(3) 可以得知(*)永遠成立。也就證明**(3)、(4)符合我們的要求。

數學定理證明雜記

只需證明任意三角形內,任一角的邊與它所對應的正弦之比值為該三角形外接圓直徑即可。現將 abc,做其外接圓,設圓心為o。我們考慮 c及其對邊ab。設ab長度為c。1.若 c為直角,則ab就是 o的直徑,即c 2r。sin c 1 特殊角正弦函式值 c sinc 2r 2.若 c為銳角或鈍角,過b作直徑...

數學 Matrix Tree定理證明

老久沒更了,冬令營也延期了 延期後豈不是志願者得上學了?最近把之前欠了好久的債,諸如fft和matrix tree等的搞清楚了 啊我承認之前只會用,沒有理解證明 fft老多人寫,而matrixtree沒人證我就寫一下吧 matrix tree的結論網上可多,大概一條主要的就是,圖中生成樹的數量等於 ...

主定理的數學證明

分治演算法中有一些演算法,僅僅用分支遞推公式無法計算出其時間複雜性,因為它的遞推方程帶有乙個冪項,雖然依靠迭代我們仍然可以求出其遞推公式,但是這麼做未免太複雜浪費時間。這時候我們有乙個通法,那就是主定理 master theorem 根據情況直接套公式就能求出時間複雜性。主定理形式如下 設f是滿足遞...