我开始研究计算逻辑,作为练习,我想证明合并排序算法的正确性。
目前,我很难证明该算法的输出将始终与给定输入的排列相对应。
如果有人可以帮助我,我将感到非常高兴。
非常感谢?
答案 0 :(得分:1)
该证明的核心将需要显示“合并”过程将每个元素插入一次,并且仅将一次插入到结果中。由于合并过程使用循环进行,因此您需要使用loop invariant来显示此内容。
通常可以通过询问“循环的一半是什么?”来发现循环不变式。
to merge arrays A and B:
let n = length of A, m = length of B
let R = new array of length (n + m)
let i = 0, j = 0
while i < n or j < m:
if i < n and (j == m or A[i] <= B[j]):
R[i+j] = A[i]
i = i + 1
else:
R[i+j] = B[j]
j = j + 1
return R
在此循环中,我们始终知道R的前i + j个元素是A的前i个元素和B的前j个元素的某些排列。这是循环不变式,因此您需要证明: / p>
通常,这样的证明的难点在于发现循环不变式,并表明循环的每次迭代都保留了不变式。
答案 1 :(得分:0)
合并排序的先决条件是什么?职位条件是什么?你有循环不变式吗?
这是开始编写证明之前必须问自己的三个问题。
然后:您的基本情况是什么?大概您知道如果处理证明时合并排序是如何工作的,那么当您将长度为1的数组传递给mergesort函数时会发生什么呢?那里的后置条件是什么?
这里是decent primer from Berkeley,用于证明函数的正确性。编写证明可能需要一些离散的数学(归纳法)。