Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Добрый день Помогите простыми словами или же более менее формально, структурировано определить понятие инварианта цикла. Потребность в этом возникла при прорешивании упражнений из "Алгоритмы. Построение и анализ" Т.Кормена. Не могу уловить, что именно от меня требуется при задании "сформулируйте инвариант". В основном, все источники говорят о том, что это логическое выражение, хотя если взять книгу того же Кормена, но попроще "Вводный курс", то у него все сводится к логическим рассуждениям - привожу скриншот. Он так упростил это понятие, что заменил "выражение" на "утверждение", или же термин "утверждение" тоже подходит? Есть ли источники с понятными формулировками и примерами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 03:53 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 03:53 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 03:54 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0, Это набор из трёх правил. Они необходимы (но не достаточны) для определения правильности логики алгоритма. Такой формальный подход порой позволяет выловить логическую ошибку, когда "на глазок" кажется, что всё правильно. Попробуй сформулировать эти правила для какой-либо из простых сортировок - выбором или вставками. Для них это дело смотрится логичнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 06:59 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0, если на пальцах, то это адаптация программистами для своих целей метода математической индукции ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 09:02 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0, пример инварианта - проверка выхода за границы массива. В некоторых ЯП и runtime этот ивариант - встроен. Еще пример. На некоторых собесах задают задачу - проверить корректность вложенных скобок. Пример корректных Код: sql 1. Пример некорректных Код: sql 1. Можно тут взять следующий ивариант. Если скобка открылась - то считаем +1 к некой переменной. Если закрылась - то считаем -1. Если в теле цикла мы вышли ниже нуля - то ошибка вложенных скобок. Ивариантом в нашем случае является НЕ-ОТРИЦАТЕЛЬНОСТЬ счетчика скобок. +В конце можно проверить на ноль. Но это уже пост-вариант. Инварианты очень леко толкать в математике. Берете просто любую формулу и как только видите квадратный корень - то сразу говорите что под корнем - не отрицательное. Это инвариант. Ну и модульные тесты и еще раз тесты. Утверждения (asserts). Контракты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 22:35 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
maytonМожно тут взять следующий ивариант. Если скобка открылась - то считаем +1 к некой переменной. Если закрылась - то считаем -1. Если в теле цикла мы вышли ниже нуля - то ошибка вложенных скобок. Ивариантом в нашем случае является НЕ-ОТРИЦАТЕЛЬНОСТЬ счетчика скобок. +В конце можно проверить на ноль. Но это уже пост-вариант.vi0, пример инварианта - проверка выхода за границы массива. В некоторых ЯП и runtime этот ивариант - встроен. Еще пример. На некоторых собесах задают задачу - проверить корректность вложенных скобок. Пример корректных Код: sql 1. Пример некорректных Код: sql 1. Инварианты очень леко толкать в математике. Берете просто любую формулу и как только видите квадратный корень - то сразу говорите что под корнем - не отрицательное. Это инвариант. Ну и модульные тесты и еще раз тесты. Утверждения (asserts). Контракты. Это неверный ответ. Инварианты в программировании используются для формального доказательства корректности алгоритмов. В общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе). В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 22:59 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Aleksandr SharahovВ общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе). В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок. А контрольная точка по вашему где должна стоять? В теле цикла может? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 23:05 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
maytonAleksandr SharahovВ общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе). В примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок. А контрольная точка по вашему где должна стоять? В теле цикла может? Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно. Цикла вообще может не быть, а например лапша из goto. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 23:14 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovmaytonпропущено... А контрольная точка по вашему где должна стоять? В теле цикла может? Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно. Цикла вообще может не быть, а например лапша из goto. Но в таком случае почему сумма скобок - не инвариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 23:15 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
maytonAleksandr Sharahovпропущено... Да. Контрольные точки доказывающий расставляет по своему усмотрению, как ему удобно. Цикла вообще может не быть, а например лапша из goto. Но в таком случае почему сумма скобок - не инвариант? Вы, вероятно, имеете в виду промежуточную сумму. Она не подходит по формальному критерию - ее значение меняется на каждой итерации. Грубо говоря, то, что она считает скобки, сидит у вас в голове, а не на бумаге. А то, что в голове никак не облегчает формальное доказательство. Она не является инвариантом потому, что мы хотим доказать, что в результате работы цикла (если только он не был прерван досрочно получением отрицательно промежуточной суммы) действительно будет получено количество незакрытых скобок. И если я выберу инвариантом свое выражение, то, очевидно, я легко докажу требуемое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 23:32 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, ну а проверка границ массива? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.07.2018, 23:59 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
maytonAleksandr Sharahov, ну а проверка границ массива? Я не совсем понимаю о чем речь, поясните: 1. какой именно алгоритм рассматривается, 2. что необходимо доказать, 3. что предлагается в качестве инварианта, 4. в каких контрольных точках. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2018, 00:06 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov... Это неверный ответ. Инварианты в программировании используются для формального доказательства корректности алгоритмов. В общем случае инвариантом называется выражение, которое всегда принимает одинаковое значение в некоторых "контрольных" точках алгоритма (например, на входе в цикл, в начале каждой итерации и на выходе). Это - очевидно, да, так и есть. +1 Aleksandr SharahovВ примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок. Это не понятно, и не ясно, как именно пригодно в качестве инструмента. Существо доказательства правильности программы в том и состоит, чтобы уверить себя в правильном счете скобок программой. Она не задваивает учет скобок, например, и/или не пропускает их. Одним, достаточно очевидным, инвариантом а) здесь будет то, что всегда на каждом шаге цикла (идя по массиву слева направо), для всех индексов меньше i все скобки уже были просмотрены , и для всех индексов больше i мы еще ничего не знаем о них. Этот инвариант универсальный - он должен выполнится до начала цикла, на каждом его шаге и после завершения цикла. инвариантом б) здесь у цикла может быть то, индекс элемента массива на текущем шаге всегда больше значения на предыдущем шаге. Выполнение а) гарантирует, что слева от итератора нет не просмотренных скобок. Выполнение б) в комбинации с а) гарантирует, что нет дважды подсчитанных. И, если при этом а) выполняется до цикла, в нем самом и после него, то можно сделать вывод что программа подсчета скобок изменила значение счетчика правильное число раз. Значит, такая программа способна правильно определить как число скобок, так и разницу между левыми и правыми скобками. Если наоборот, для конкретного цикла нельзя доказать поддержку обоих инвариантов а) и б), то, как минимум, надо искать другие инварианты, из которых можно было бы доказать правильность работы такого цикла. Или же, такая программа ошибочна, и считает скобки неверно. Касательно границ массива - существо дела в том, что если компилятор способен понять, что цикл поддерживает инвариант, состоящий в том, что текущий индекс в цикле на каждом его шаге не выходит за границы массива, то, в принципе, он способен отключить для тела цикла проверку на границы массива. (конечно, если вообще обучен такому умению). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2018, 00:54 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
boobyAleksandr SharahovВ примере со скобками инвариант цикла - это текущая накопленная сумма, плюс алгебраическая сумма оставшихся скобок. Это не понятно, и не ясно, как именно пригодно в качестве инструмента. На мой взгляд, наоборот доказательство прозрачно. (Случай с отрицательной промежуточной суммой не рассматриваем - там все очевидно.) 1. Первоначально все скобки лежат в массиве, накоплено 0. 2. На первом и каждом следующем шаге мы одну очередную скобу перекладываем в сумку. Очевидно, при этом общее их количество (сумка+массив) не изменилось. 3. Цикл обязательно завершится, т.к. число элементов конечно и мы каждый раз переходим к непосредственно к следующему. В конце цикла все скобки будут переложены в сумку, значит, мы посчитали количество незакрытых скобок в исходном массиве. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.07.2018, 01:23 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahovvi0, если на пальцах, то это адаптация программистами для своих целей метода математической индукции ) причем без адаптации матиндукция выглядит куда понятнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2018, 00:20 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
tchingizAleksandr Sharahovvi0, если на пальцах, то это адаптация программистами для своих целей метода математической индукции ) причем без адаптации матиндукция выглядит куда понятнее. Для доказательства всегда пригодны оба метода, они полностью эквиваленты. Когда утверждение индукции легко формулируется для промежуточных состояний (как в задаче со скобками), то, разумеется, проще воспользоваться индукцией. Когда формулировка получается тяжеловесной или касается чего-то, что не может существовать в реальной жизни (например, полтора землекопа), то лучше подходит метод инварианта. Мы просто говорим, что вот эта величина всегда равна константе, не вдаваясь в ее физический смысл на различных шагах алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2018, 01:31 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Упустил еще один важный момент - простота внесения изменений. Проверить неизменность инварианта после внесения изменений довольно просто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2018, 01:40 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2018, 09:59 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0Добрый день Помогите простыми словами или же более менее формально, структурировано определить понятие инварианта цикла. Потребность в этом возникла при прорешивании упражнений из "Алгоритмы. Построение и анализ" Т.Кормена. Не могу уловить, что именно от меня требуется при задании "сформулируйте инвариант". В основном, все источники говорят о том, что это логическое выражение, хотя если взять книгу того же Кормена, но попроще "Вводный курс", то у него все сводится к логическим рассуждениям - привожу скриншот. Он так упростил это понятие, что заменил "выражение" на "утверждение", или же термин "утверждение" тоже подходит? Есть ли источники с понятными формулировками и примерами. Здесь все довольно просто. Инвариант - это "что-то" постоянное. И он может быть не только для цикла, но и для дерева, например, или любого другого процесса. Нередко используется для обозначения чего-то постоянного в нестационарных процессах, т.е. с течением времени инвариант сохраняется. Простейший пример, скорость света в одинаковой среде. Или в математике, вы переходите из одного множестве в другое, посредством взаимно-однозначного соответствия, мощность в данном случае будет инвариантом для любого оператора перехода. Что касается доказательства корректности тех или иных конструкций, то совместно применяют такие понятия как инваринт и варианта. Инвариант должен сохраняться на каждой итерации, что свидетельствует о корректности алгоритма на различных наборах входных данных, варианта должна уменьшаться, что необходимо для сходимости ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2018, 23:05 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
LR, интересная формулировка "A loop invariant is a relation among program variables" ближе к неокрепшим мозгам чем "инвариант это утверждение" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2018, 04:57 |
|
||
|
Что такое "Инвариант цикла" ?
|
|||
|---|---|---|---|
|
#18+
vi0LR, интересная формулировка "A loop invariant is a relation among program variables" ближе к неокрепшим мозгам чем "инвариант это утверждение" Уверен, тут отношение трактуется расширительно и вовсе не подразумевается одна формула. Существуют классы задач (например, сортировки или оптимизационные и т.п.), которые оперируют с некоторым обобщенным состоянием процесса и где упрощенное толкование затруднительно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2018, 09:44 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39678052&tid=1340075]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
2ms |
| others: | 298ms |
| total: | 589ms |

| 0 / 0 |
