[英]Prove that merge sort outputs a permutation of the input
我開始研究計算邏輯,作為練習,我想證明歸並排序算法的正確性。
目前,我很難證明該算法的 output 將始終對應於給定輸入的排列。
如果有人可以幫助我,我會很高興。
非常感謝
該證明的核心將需要表明“合並”過程將每個元素插入一次且僅一次到結果中。 由於合並過程使用循環工作,因此您需要使用循環不變量來顯示這一點。
循環不變量通常可以通過詢問“循環進行到一半我知道什么?”來發現。
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 個元素的某種排列。這就是循環不變量,所以你需要證明:
一般來說,像這樣的證明的難點在於發現循環不變量,並表明循環的每次迭代都保留了不變量。
歸並排序的前提是什么? 什么是崗位條件? 你有任何循環不變量嗎?
在你開始寫你的證明之前,這是你必須問自己的三個問題。
然后:你的基本情況是什么? 如果您正在處理證明,大概您知道合並排序是如何工作的,那么當您將一個長度為 1 的數組傳遞給合並排序 function 時會發生什么? 那里的后置條件是什么?
這是伯克利關於如何證明 function 正確性的一本不錯的入門書。 編寫證明可能需要一些離散數學(歸納)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.