[英]Loop Iterative Program Correctness Example - Loop Invariants and Program Termination
[英]Program correctness for a cubic sort program
我需要一些幫助來證明我的 python 三次排序程序的循環不變性。
到目前為止,我發現了包含兩部分的循環不變量
def cubicSort(L):
i = 0
while i + 1 < len(L):
if L[i] > L[i + 1]:
L[i], L[i + 1] = L[i + 1], L[i] # That is, swap L[i] and L[i + 1].
i = 0
else:
i = i + 1
前提是 L 是一個整數列表 post: 是這個列表是置換和排序的
我不知道如何接近證明
正確性證明有兩個要素:你必須證明當算法終止時,結果是正確的; 你必須證明算法確實終止了。
您的兩個循環不變量都是正確的,但您確實需要證明它們是不變量。 為了證明這一點,您必須在循環的第一次迭代之前證明它們為真,如果它們在某個迭代之前為真,那么在該迭代之后它們將為真。
完成之后,很簡單,當循環終止時, i + 1 == len(L)
並且因此L[0:i+1]
等於L
,因此當循環終止時L
被排序。
通常更直接地表明算法終止,通過找到一個循環變體- 一個 integer 量,在循環的每次迭代中變小,當數量達到 0 時導致循環終止。但是對於這個算法,有不是明顯的變體,因為循環計數器i
在循環內被重置為0
,這意味着這個變量不會簡單地單調變大或變小。
這個證明的關鍵是考慮列表中 倒置的數量,其中“倒置”是指一對亂序的列表元素。 在每次迭代中,要么i
變大,要么i
重置為 0,但反轉次數減少 1。 i
不可能繼續變大,並且反轉次數要保持變小而i
沒有達到while
是不可能的循環界限,或者倒數達到0。一旦列表中沒有倒數, L[i] > L[i + 1]
總是假的,所以i
會繼續增加到界限,然后循環根據需要終止。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.