OberonCore https://forum.oberoncore.ru/ |
|
"Алгоритмы и структуры данных. Новая версия для Оберона" https://forum.oberoncore.ru/viewtopic.php?f=80&t=1970 |
Страница 8 из 8 |
Автор: | Info21 [ Суббота, 29 Июнь, 2019 03:35 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Спасибо за комплимент Ваших замечаний. Прямо сейчас ответить не смогу. |
Автор: | Валерий Лаптев [ Суббота, 29 Июнь, 2019 06:28 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
kemiisto писал(а): Текст: Цитата: Страница 52, Строкa 31 Замечание: Не понимаю, почему тут R := N, а не R := N - 1.L :=О; R := N; На предыдущей странице в листинге ADruS18_Поиск стоит R := N-1; Но и условие в цикле L <= R. В коде R := m-1; На странице 52 поставили R := N; Но и условие поменяли L < R. В коде тоже R := m; Все согласованно изменено. |
Автор: | Info21 [ Суббота, 29 Июнь, 2019 09:47 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Спасибо за помощь )) |
Автор: | kemiisto [ Суббота, 29 Июнь, 2019 12:43 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Валерий Лаптев писал(а): Все согласованно изменено. Да, спасибо. С этим моментом разобрался. Суть в том, что в этом варианте поиска, как и написано в книге, "ищется не элемент a[m] = х, а граница, отделяющая все элементы, меньшие х, от всех прочих". Тогда для частного случая, когда элемента x в массиве нет, т.е. x превосходит все a[i], действительно необходимо проверить в цикле и последний элемент с индексом N - 1, поэтом R изначально должно быть N. В ином случае этот последний элемент проверен не будет и последующее утверждение, что в случае, "если R = N, то искомого значения в массиве нет" будет неверным. В конечном итоге полностью вариант из учебника должен выглядит как-то так: Код: L := 0; R := N; WHILE L < R DO m := (L+R) DIV 2; IF a[m] < x THEN L := m+1 ELSE R := m END END; IF R = N THEN (* Если R = N, то искомого значения в массиве нет. *) (* элемент найден *) ELSE (* В противном случае нужно учесть, что элемент a[R] еще не сравнивался. *) IF a[R] = х THEN (* элемент найден *) ELSE (* элемент не найден *) END END Так вот, глядя на такой код, мне в голове "лезет" немного другой вариант: Код: L := 0; R := N - 1; WHILE L < R DO m := (L+R) DIV 2; IF a[m] < x THEN L := m+1 ELSE R := m END END; IF a[R] = х THEN (* элемент найден *) ELSE (* элемент не найден *) END Здесь a[R] сравнивается по окончании цикла в любом случае, так как частный случай с отсутствием искомого значение в массиве надо учесть. По сути проверка последнего элемента в этом частном случае перенесена из цикла в условный оператор. Сам условный оператор получается "проще" и R тут уже будет достаточно N - 1, но теряется ... эммм... концептуальная простота что-ли алгоритма, т.к. простое словесное описание действий, выполняемых в цикле, данное ранее ("ищется не элемент a[m] = х, а граница, отделяющая все элементы, меньшие х, от всех прочих") здесь уже не работает - в обсуждаемом частном случае до границы мы так и не дойдём. Кроме того, теряется и "фундаментальное структурное подобие этого алгоритма и алгоритма линейного поиска в предыдущем разделе: роль i теперь играет тройка L, m, R", на котором чуть раньше заостряет внимание автор. |
Автор: | kemiisto [ Воскресенье, 30 Июнь, 2019 12:02 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
"Подумал". Проверку в варианте из учебника можно "упростить" до: Код: IF R < N & a[R] = x THEN
(* элемент найден *) ELSE (* элемент не найден *) END |
Автор: | Info21 [ Воскресенье, 30 Июнь, 2019 20:42 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
kemiisto писал(а): [ Проверьте случай, когда все элементы массива < x.
Так вот, глядя на такой код, мне в голове "лезет" немного другой вариант: [code]L := 0; R := N - 1; WHILE L < R DO m := (L+R) DIV 2; |
Автор: | Valery Solovey [ Четверг, 04 Июль, 2019 16:40 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
kemiisto писал(а): Страница 50, Строки 11-12 Текст: Цитата: До и после каждого шага цикла выполняется следующее условие: Замечание: Если искомого элемента в массиве нет, то после заключительного шага цикла приведённое условие будет ложным, т.к. i = N. Не должна ли первая часть условия быть (0 ≤ i ≤ N)?(0 ≤ i < N) & (Ak: 0 ≤ k < i : ak # х) Сейчас в книгу заглянуть не могу, чтобы точно контекст опередлить, так что могу ошибаться. Однако, мне кажется, что исходное выражение правильное, и это инвариант. А вот сопроводительный текст не уточняет, что речь об инварианте, но поясняет определённое свойство инварианта: он верен до и после итерации (если не выполнено постусловие, после чего инвариант бессмысленнен). |
Автор: | Rifat [ Четверг, 04 Июль, 2019 17:10 ] |
Заголовок сообщения: | Re: "Алгоритмы и структуры данных. Новая версия для Оберона" |
Инвариант должен быть истинен и после выполнения цикла. А после выполнения цикла i будет равняться N, соответственно инвариант не будет истинен. Поэтому правильный инвариант должен быть: (0 ≤ i ≤ N) & (Ak: 0 ≤ k < i : ak # х) |
Страница 8 из 8 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |