資料結構與演算法隨筆之------哨兵變數
阿新 • • 發佈:2018-12-20
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
但是如果你設定了哨兵變數為最大值,所以就不會出現上面那張情況,因為你插入到元素肯定比哨兵要小,這樣做可以簡化判斷條件,避免出錯