????什么叫循環(huán)不變式?不只是一種計算機(jī)科學(xué)的思想,準(zhǔn)確地說是一種數(shù)學(xué)思想。在數(shù)學(xué)上闡述了通過循環(huán)(迭代、遞歸)去計算一個累計的目標(biāo)值的正確性,屬于基礎(chǔ)數(shù)學(xué)的范疇,而且在計算機(jī)上也應(yīng)用廣泛。
????循環(huán)不變式主要用來幫助理解算法的正確性,其主體是不變式,也就是一種描述規(guī)則的表達(dá)式。過程分三個部分:初始,保持,終止?!?br>
?。?)初始:保證在初始的時候不變式為真。
?。?)保持:保證在每次循環(huán)開始和結(jié)束的時候不變式都為真。
(3)終止:如果程序可以在某種條件下終止,那么在終止的時候,就可以得到自己想要的正確結(jié)果。
舉個栗子:
public static int binarySerach1(int[] arr, int target) {
//循環(huán)不定式條件:定義一個區(qū)間[left...right],在這個區(qū)間內(nèi)查找target
int left = 0, right = arr.length - 1;
int mid = -1;
while(left <= right){//[left...right]滿足條件,比如[12, 12]數(shù)組中有一個元素12
mid = left + ((right-left)>>1);//注意符號優(yōu)先級
if(arr[mid] == target){
return mid;
}
if(arr[mid] < target){//更新左邊界,不包含mid,維持循環(huán)不定式:[mid + 1...right]成立
left = mid + 1;
}else{//更新右邊界,不包含mid,維持循環(huán)不定式:[left...mid - 1]成立
right = mid - 1;
}
}
return mid;
}
public static int binarySerach2(int[] arr, int target) {
//循環(huán)不定式條件:定義一個區(qū)間[left...right),在這個區(qū)間內(nèi)查找target
int left = 0, right = arr.length;
int mid = -1;
while(left < right){//[left...right)滿足條件
mid = left + ((right-left)>>1);//注意符號優(yōu)先級
if(arr[mid] == target){
return mid;
}
if(arr[mid] < target){//更新左邊界,不包含mid,維持循環(huán)不定式:[mid + 1...right)成立
left = mid + 1;
}else{//更新右邊界,不包含mid,維持循環(huán)不定式:[left...mid)成立
right = mid;
}
}
return mid;
}
參考:
1.https://baike.baidu.com/item/%E5%BE%AA%E7%8E%AF%E4%B8%8D%E5%8F%98%E5%BC%8F/10593291?fr=aladdin
2.慕課網(wǎng):玩轉(zhuǎn)算法面試 作者:liuyubobobo