TheRealJ Ответов: 1

Нужна помощь в понимании объяснения индукционного доказательства для алгоритма


Мне трудно понять, как автор Стивен Скиена из книги The Algorithm Design Manual использовал метод индукции для доказательства следующего алгоритма, который представляет/возвращает y = y + 1 в псевдокоде:

Increment(y)
        if y = 0 then return(1) else
            if (y mod 2) = 1 then
                 return(2 · Increment(y/2)) 
            else return(y + 1)


В частности, я не понимаю, как он получил от первого уравнения/равенства 2·инкремент(м + 1/2) к следующему 2·инкремент(м) в приведенном ниже доказательстве. В своем полном тексте он утверждает, что:

"Для нечетных чисел ответ зависит от того, что возвращается приращением(y/2). Здесь мы хотим использовать наше индуктивное предположение, но оно не совсем верно. Мы предположили, что инкремент работает правильно для y = n − 1, но не для значения, которое составляет примерно половину его. Мы можем решить эту проблему, укрепив наше предположение и объявив, что общий случай справедлив для всех y ≤ n−1. Это нам в принципе ничего не стоит, но необходимо для установления правильности алгоритма.

Теперь можно рассмотреть случай нечетного y (т. е. y = 2m + 1 для некоторого целого числа m)
как:

2·Increment((2m + 1)/2) = 2·Increment(m + 1/2)
                        = 2·Increment(m)
                        = 2(m + 1)
                        = 2m +2 = y + 1

"

Что я уже пробовал:

Я понимаю, что алгоритм рекурсивен и что он корректен как для четных, так и для нечетных чисел, всегда увеличивающих входное значение y. Однако автор использует индукцию для доказательства алгоритма, и для случая, когда y = m + 1, я не знаю, почему + 1/2 просто исчез. Я не думаю, что это подходит для случаев, когда m просто настолько велико, что 1/2 почти несущественно, поскольку мы говорим о том, является ли m + 1 четным или нечетным.

Richard MacCutchan

Вы всегда можете спросить автора.

Gerry Schmitz

2·инкремент((2m + 1)/2) = 2·инкремент(m + 1/2)
= 2·инкремент(м)
= 2(m + 1)
= 2m +2 = y + 1

1 Ответов

Рейтинг:
9

Stefan_Lang

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

Кроме того, в случае расчетов, приводящих к нецелому значению, нецелая часть отсекается, а не округляется. Это стандартная целочисленная математика: 5/2 = 2 (плюс остаток)

В этих предположениях m+1/2 интерпретируется как m.

*: чтобы быть более точным, индукция работает на любом множестве, которое упорядочено и счетно (даже счетно бесконечно), но подразумевается всегда множество целых чисел, если не указано иное.


Кстати, мне очень жаль, что автор предпочел не выражаться яснее. Индукция не является тривиальным методом объяснения, она не помогает без необходимости вводить в пример(ы) спотыкающиеся камни.


TheRealJ

Большое вам спасибо, что нашли время! Теперь я понимаю, чего мне не хватало. Отличное объяснение ;)