簡體   English   中英

證明歸並排序輸出輸入的排列

[英]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. 這在循環開始之前(當 i = j = 0 時)是正確的。
  2. 如果在循環的迭代之前這是真的,那么在該迭代之后它仍然是真的,即保持不變。
  3. 如果循環終止時(當 i = m,j = n)為真,則數組 R 具有所需的屬性。

一般來說,像這樣的證明的難點在於發現循環不變量,並表明循環的每次迭代都保留了不變量。

歸並排序的前提是什么? 什么是崗位條件? 你有任何循環不變量嗎?

在你開始寫你的證明之前,這是你必須問自己的三個問題。

然后:你的基本情況是什么? 如果您正在處理證明,大概您知道合並排序是如何工作的,那么當您將一個長度為 1 的數組傳遞給合並排序 function 時會發生什么? 那里的后置條件是什么?

這是伯克利關於如何證明 function 正確性的一本不錯的入門書。 編寫證明可能需要一些離散數學(歸納)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM