[英]finding loop invariant for two nested while loops java
我對不變式有點熟悉,我可以在一個較小的循環中或多或少地找到它。 當為java的以下偽代碼求解不變式時,我很困惑。 誰能幫忙嗎:
Input: an array A
i <- length(A)
# outer invariant
while i != 0 do
k <- i
j <- i - 1
# inner invariant
while j != 0 do
if A[j] > A[k] then
k <- j
j <- j - 1
# inner invariant
swap(A, i, k)
i <- i - 1
# outer invariant
您應該計算出從內部循環開始的嵌套循環的不變量:
while (j != 0) {
if (A[j] > A[k]) {
k = j;
}
j--;
}
你可以觀察到
A[k] >= A[x], for any (j < x) && (x <= i)
在循環的末尾, j == 0
,因此將Hoare Tripple用於while
循環,可以聲明在內部循環的末尾
A[k] >= A[x], for any (0 < x <= i)
這是說A[k]
是MAX(A[0:i])
另一種說法。
現在您可以繼續進行外部循環:由於i
從A.length
向下減小到零,因此不變式為
A[y] < A[x], for any (y >= i) for any (y < x <= Length(A))
再次使用Hoare Trippe,您可以得出以下結論:退出外循環后,數組A
會以升序排序:
A[y] < A[x], for any (y >= 0) for any (y < x <= Length(A))
您的代碼片段可以按以下方式減少和格式化(您是否習慣C語言語法?):
for ( i = n; i > 0 ; i -- ) {
for ( j = i - 1 ; j > 0 ; j -- ) {
// Constant time instructions here symbolized by c
}
}
從上面的片段中傳遞給Sigma Notation不會太麻煩:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.