Докажите, что сортировка слиянием выводит перестановку ввода - PullRequest
0 голосов
/ 30 октября 2019

Я начинаю изучать вычислительную логику, и в качестве упражнения я хочу доказать правильность алгоритма сортировки слиянием.

В настоящее время у меня возникают трудности с доказательством того, что выходные данные этого алгоритма будут всегдасоответствует перестановке данного ввода.

Я был бы очень рад, если бы кто-то мог помочь мне с этим.

Большое спасибо 100

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Суть этого доказательства должна показать, что процедура «слияния» вставляет каждый элемент один и только один раз в результат. Поскольку процедура слияния работает с использованием цикла, вам нужно использовать инвариант цикла , чтобы показать это.

Инварианты цикла обычно можно обнаружить, спросив: «Что я знаю на полпути? через цикл? "

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

В этом цикле мы всегда знаем, что первые i + j элементы R являются некоторой перестановкой первых i элементов A и первых j элементов BЭто инвариант цикла, поэтому вам нужно показать, что:

  1. Это верно до начала цикла (когда i = j = 0).
  2. Если это верно доитерации цикла, то после этой итерации она остается истинной, то есть инвариант сохраняется.
  3. Если это так, когда цикл завершается (когда i = m, j = n), то массив R имеетобязательное свойство.

В общем, сложные части доказательства, подобные этому, обнаруживают инвариант цикла и показывают, что инвариант сохраняется при каждой итерации цикла.

0 голосов
/ 30 октября 2019

Каковы предпосылки сортировки слиянием? Каковы почтовые условия? У вас есть петлевые инварианты?

Это три вопроса, которые вы должны задать себе, прежде чем начать писать свое доказательство.

Тогда: каковы ваши базовые случаи? Предположительно, вы знаете, как работает сортировка слиянием, если вы работаете с доказательством, так что же произойдет, если у вас есть массив длины 1, переданный в функцию mergesort? Что там за постусловие?

Вот достойный учебник из Беркли о том, как доказать правильность функции. Для написания доказательства может потребоваться некоторая дискретная математика (индукция).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...