Lite_stream
@Lite_stream

Можно ли так доказывать правильность алгоритмов?

Проблема несложная, но на её примере проще всего показать, что имеется в виду

Проблема: Есть прямоугольники с шириной и высотой. Найти максимальное количество таких прямоугольников, что их можно вложить друг в друга (условие вкладки: widthA <= widthB, heightA <= heightB).

Решение: отсортировать массив по координате X, а при равенстве X по коопдинате Y и найти в получившемся массиве НВП по Y

66531ef5f2ff6790808496.png
Доказательство: Пусть в отсортированном массиве где-то располагается правильная последовательность прямоугольников максимальной длины (обозначена зелёными кружками на картинке). Тогда в этом отсортированном массиве относительный порядок элементов последовательности (как подпоследовательности) не нарушен: если xi > xj, значит элемент i правее в массиве, а если xi = xj, и yi > yj, то элемент i правее в массиве, а значит у максимальной длины последовательности в отсортированном таким образом массиве относительный порядок элементов такой же, как у правильной последовательности. Значит, если в этом массиве искать НВП по Y, то мы обязательно найдём эту последовательность (зелёные кружки)

Часто приходилось именно таким образом доказывать правильность работы алгоритма, что есть какой-то оптимум в проблеме, то алгоритм обязательно его не пропускает.

Вопрос: с формальной точки зрения является ли такое доказательство (когда доказательство основывается на том, что есть какой-то оптимум в проблеме и алгоритм всегда находит его) правильным, в том смысле что не упускает ли каких-то краеугольных вещей?
  • Вопрос задан
  • 181 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Если их нельзя переворачивать и при равенстве высот все-равно можно вложить (а не только строго меньшее), ио алгоритм правильный. Но доказательство не полное. Надо доказать, что любая неубывающая последовательность в этом массиве даст веладывающиеся прямоугольники.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vadimr
Не очень понятно, что вы в данном случае называете доказательством правильности. С формальной точки зрения, тут надо начинать доказывать с того, что представления чисел в вашей машине образуют строго упорядочиваемую операцией ">" последовательность, а это, кстати, неправда (для примера рассмотрим прямоугольники с размерами, равными NaN).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы