我对不变量有点熟悉,我或多或少可以找到一个小循环。 当解决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
答案 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])
的方式。
现在你可以继续外循环了:因为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))
答案 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不会太麻烦: