1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# конспект · шаг 7 из 7

Конспект: инженерия алгоритмов и проверка результата

выжимка - её можно унести в заметки

Понятия

Стресс-тест - быстрое решение и перебор-эталон на тысячах маленьких входов; остановка на первом расхождении.

Гипотеза малой области - у логических ошибок почти всегда есть маленький свидетель.

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

Сертификат - данные, по которым ответ проверяется быстро и независимо от способа решения. Сертифицирующий алгоритм - выдаёт ответ вместе с сертификатом.

Инвариант - условие на состояние структуры после каждой операции. Метаморфное отношение - связь ответов на два родственных входа; проверяется без знания правильного ответа.

Что унести

СТРЕСС-ТЕСТ
эталон: перебор по определению; генератор: длина 0-5, значения 1..3-10
пара с суммой s, ошибка i <= j:
  значения до 10⁹ - 2000 попыток чисто; до 10 - 4-я; до 3 - 3-я
полный перебор: длины 0-3, значения 1-3, s 2-6 = 200 входов,
  45 расхождений, самое маленькое - [1], s = 2
«не нашли» в малой области = «нет» только в этой области
УМЕНЬШЕНИЕ
куски: половина -> четверть -> по одному; потом числа к нулю
признак «разошлись»: 30 отрезков -> [] за 3 проверки (другая ошибка)
признак «непустой и недосчитывает»: -> [[1, 2], [0, 3]] за 56
вложенный отрезок: kon = s[1] вместо max(kon, s[1])
QuickCheck, Hypothesis: найти -> уменьшить -> показать
СЕРТИФИКАТЫ (Сандерс, 2.6.4)
сортировка: соседи по порядку + счётчики значений, O(n)
двудольность: раскраска / нечётный цикл
ацикличность: топологический порядок / цикл
кратчайшие пути: dist[v] <= dist[u] + w для всех рёбер (не завышено)
  + тугое ребро от родителя у каждой вершины (не занижено), O(V + E)
поток - разрез; паросочетание - покрытие (Кёниг); ЛП - двойственное
СВОЙСТВА
инвариант кучи: сломан на 11-й операции, ответ неверен с 14-й
метаморфные для пути: веса ×2 -> ответ ×2; новое ребро не удлиняет;
  переименование вершин не меняет
жадный «к ближайшему»: ×2 - 0 нарушений из 83; ребро - 7 из 83
поиск: нерелевантный документ не меняет топ
РАЗМЕН МОНЕТ
наименьший контрпример к жадности, если есть, < суммы двух крупнейших
  (Козен, Закс, 1994); две монеты с 1 - жадность всегда верна
1,3,4 -> 6; 1,7,10 -> 14; 1,15,25 -> 30; 1,98,99 -> 196
стресс на суммах до 10 пропускает 5 наборов из 6 с ошибкой

Ловушки джокера

Широкий диапазон в генераторе. Тысячи чистых попыток и ложное спокойствие.

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

Признак «что-то не так». Уменьшение соскальзывает к пустому входу и чинят не ту ошибку.

Проверка тем же способом. Вторая Дейкстра из той же библиотеки ошибается так же.

Половина постусловия. Только «упорядочен» - и потеря повторов проходит.

Одно слабое отношение. Масштабирование прошло 83 из 83 - а ошибка в выборе направления осталась.

Молчание стресс-теста за доказательство. Без границы области «не нашли» не значит «нет».

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.