1. 程式人生 > >資料結構與演算法隨筆之------哨兵變數

資料結構與演算法隨筆之------哨兵變數

1. 哨兵(sentinel ) 哨兵:顧名思義,指站崗、放哨、巡邏、稽查的士兵。

常用來作為比較,  比大小,快排 比相等與否,判等;

int i = 0;
while ( i < 10 ){
    ...
    ++i;
}

1 2 3 4 5 while 迴圈中的變數 i 控制著最終的迴圈次數。這是非常流行的一個表示法,具有這個作用的變數有時也稱為哨兵變數(Sentinel variable)。

再比如快排,

就是 sentinel ,就是用來指定一個位置的特殊元素,比如快速排序裡面,需要選一個變數作為中間值,這個值就是一個 sentinel,又比如用來指示一個佇列尾部位置的變數。

2. 哨兵的應用:簡化邊界條件的處理

比如關於堆的建立與插入操作

不知道這兩張圖你能不能看懂

就是如果你不設定了哨兵,你的for迴圈的判斷條件就是在原本的基礎上加上i > 1

for ( ; H->Data[i/2] < X && i > 1; i/=2 )

因為如果你要插入的數比陣列中所有元素都要大,那就要一直往上(前)比,比到最上面時,這個數的下標就為0了,要知道堆的建立是從下標一開始的,那就說明這時候要插入的數已經在陣列外面了,這很明顯不對。所以此時要加入判斷條件i > 1

但是如果你設定了哨兵變數為最大值,所以就不會出現上面那張情況,因為你插入到元素肯定比哨兵要小,這樣做可以簡化判斷條件,避免出錯