簡體   English   中英

查找兩個嵌套的while循環的循環不變java

[英]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])另一種說法。

現在您可以繼續進行外部循環:由於iA.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM