为两个嵌套的while循环java找到循环不变量

时间:2013-06-09 11:23:27

标签: java nested-loops invariants loop-invariant

我对不变量有点熟悉,我或多或少可以找到一个小循环。 当解决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

2 个答案:

答案 0 :(得分:1)

你应该从内部循环开始计算嵌套循环的不变量:

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))

答案 1 :(得分:0)

您的代码片段可以缩小并格式化如下(您习惯使用C语言语法吗?):

for ( i = n; i > 0 ; i -- ) {
    for ( j = i - 1 ; j > 0 ; j -- ) {
        // Constant time instructions here symbolized by c
    }
}

从上述片段传递到Sigma Notation不会太麻烦:

enter image description here