紮實打牢資料結構演算法根基,從此不怕演算法面試系列之006 week01 02-06 迴圈不變數

皿哥的技術人生發表於2023-04-17

迴圈不變數

1、迴圈開始時需要做什麼?

之前我們講的線性查詢法的核心程式碼如下:

public static <E> int search(E [] data,E target){
    for (int i = 0; i < data.length; i++)
        if (data[i].equals(target))
            return i;
    return -1;
}

我們是否有思考過,這樣一個簡單的查詢演算法,用到了迴圈,但是每一輪迴圈開始前,需要滿足的條件是什麼?

mark

mark

其實,迴圈開始時,需要確認:
確認data[i]是否是目標
透過語句,if (data[i].equals(target))判斷

迴圈體執行完一次時:
我們確認了data[i]不是目標,換句話,即:data[0…i]中沒有找到目標。

mark

注:方括號[]表示的時閉區間,圓括號()表示的是開區間。
閉區間包含開閉的元素,開區間不包含開閉的元素。
也可以半開半閉,即:(],或者[)。
即:data[0…i],也可以表示為data[0…i-1)

2、什麼是迴圈不變數?

什麼是迴圈不變數呢?
迴圈不變數定義:即每一輪迴圈開始時,迴圈都滿足的性質或者條件。

mark

3、迴圈不變數的作用

迴圈不變數的作用,其實如定義所講,幫助我們釐清每一輪迴圈開始時迴圈所處的條件。有助於釐清演算法實現的思路。
mark

在迴圈中,迴圈體的作用,就是維持迴圈不變數。

迴圈體和迴圈不變數的關係,本身也是”證明“演算法正確性的一種方式。
這裡的”證明“用了引號,因為並不是嚴謹的數學證明。

mark

其實,每次迴圈開始時,滿足一個條件,
即:data[0……i-1]中沒有找到目標。

總結重點:
寫出正確的程式碼,需要定義清楚迴圈不變數,迴圈體的作用就是為了維持迴圈不變數。

mark

相關文章