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
L :=О; R := N;
Замечание: Не понимаю, почему тут R := N, а не R := N - 1.

На предыдущей странице в листинге 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, но теряется ... эммм... концептуальная простота что-ли :D алгоритма, т.к. простое словесное описание действий, выполняемых в цикле, данное ранее ("ищется не элемент 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 писал(а):
[
Так вот, глядя на такой код, мне в голове "лезет" немного другой вариант:
[code]L := 0; R := N - 1;
WHILE L < R DO
m := (L+R) DIV 2;
Проверьте случай, когда все элементы массива < x.

Автор:  Valery Solovey [ Четверг, 04 Июль, 2019 16:40 ]
Заголовок сообщения:  Re: "Алгоритмы и структуры данных. Новая версия для Оберона"

kemiisto писал(а):
Страница 50, Строки 11-12
Текст:
Цитата:
До и после каждого шага цикла выполняется следующее условие:
(0 ≤ i < N) & (Ak: 0 ≤ k < i : ak # х)
Замечание: Если искомого элемента в массиве нет, то после заключительного шага цикла приведённое условие будет ложным, т.к. i = N. Не должна ли первая часть условия быть (0 ≤ i N)?


Сейчас в книгу заглянуть не могу, чтобы точно контекст опередлить, так что могу ошибаться. Однако, мне кажется, что исходное выражение правильное, и это инвариант. А вот сопроводительный текст не уточняет, что речь об инварианте, но поясняет определённое свойство инварианта: он верен до и после итерации (если не выполнено постусловие, после чего инвариант бессмысленнен).

Автор:  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/