1.9Kпросмотров
26 января 2023 г.
Score: 2.1K
Инвариант это просто топ слово. А значит оно ровно вот что - постоянное, неизменное Скажешь "сохраняется инвариант" на собеседовании, и сразу +10 очков за стиль, только не забудь, что после этой фразы должно быть что-то осмысленное, дальше объясню Фразы в копилочку: - внутренний/внешний цикл (второй содержит первый) - в начале каждой итерации цикла/функции (это про начальные условия, это база, видишь аналогии? в добавок это ключ к построению инварианта) - в конце каждой итерации цикла (это уже про инвариант, и больше похоже на шаг в математической индукции) - после цикла - результат последней итерации цикла (зная инвариант все становится просто) А вообще, зачем это все: - приятно быть на одной волне, используя одинаковые термины, уметь подсветить кусочек, который тебе кажется важным - "сохраняется инвариант" звучит даже лучше, чем "легко увидеть" - обычно после того, как вы вместе увидели, что сохраняется какой-то инвариант, задача решена и все аплодируют - очень полезно самому искать инварианты в своем коде и проговаривать про себя их, потому что обычно "является" или "не является" ли какое-от утверждение инвариантом влияет вообще на все И так, что я имею в виду под инвариантами: - Простое. В конце каждой итерации цикла в переменной sum хранится сумма всех чисел от 1 до i включительно sum = 0 for i in range(1, N + 1): sum += i - Сложнее, пришлось покодить минут 20 чтобы правильно сформулировать. Для бинарного поиска нужно несколько инвариантов - в начале каждой итерации цикла у нас расстояние между left и right как минимум 2 - следовательно, у нас есть элемент между left и right - следовательно, mid не равен ни left, ни right (сложнее увидеть, проще проверить, но в качестве упражнения можно и доказать) - следовательно left и right все время сближаются, а это не позволяет нам зациклиться - если у в начале цикла у нас в [left, right) содержался один или несколько элементов равных x, то и в конце цикла в (обновленном) интервале [left, right) содержится самый правый элемент, который был равен x - после цикла у нас либо один элемент в оставшемся полуинтервале, либо ноль, в зависимости от того, чему оставшийся элемент равен, если он есть, зависит ответ def bin_search(arr, x): left, right = 0, len(arr) while right - left > 1: mid = (left + right) // 2 if arr[mid] <= x: left = mid else: right = mid if left == right or arr[left] > x: return left return left + 1 Если не знаешь, что такое бинарный поиск - не беда, погугли или подожди одну из следующих пятиминуток #пятиминутка #математика #python
1.9K
просмотров
2619
символов
Нет
эмодзи
Нет
медиа

Другие посты @dev_adoption

Все посты канала →
Инвариант это просто топ слово. А значит оно ровно вот что - — @dev_adoption | PostSniper