2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Поиск в строке делением пополам (у Вирта ошибка?)
Сообщение18.06.2009, 12:41 
Аватара пользователя
Добрый день,

в книге Н. Вирта "Алгоритмы и Структуры данных" нашел вот такой код :

Код:
T : ARRAY [0..N-1] OF String;
x : String;
....
L := 0; R := N;
WHILE L < N DO BEGIN
    m := (L + R) div 2; i := 0;
    WHILE (T[m, i] = x[i]) and (CHR(x[i]) <> #0) DO i := i + 1;
    IF T[m, i] < x[i] THEN L := m + 1 ELSE R := m;
END;
IF R < N THEN BEGIN
    i := 0;
    WHILE (T[R, i] = x[i]) and (x[i] <> #0) DO i := i + 1;
END;
(* (R < N) and  (T[R, i] = x[i]) фиксирует совпадение *)


Не могу понять с какой целью R присваивается значение N, если массив определен как
Код:
T : ARRAY [0..N-1] OF String;
Если положить
Код:
R := N - 1;
то программа будет работать в общем случае не хуже, а в лучшем случае на короче 1 проход цикла.
Или я что-то упустил?

 
 
 
 Re: Поиск в строке делением пополам (у Вирта ошибка?)
Сообщение18.06.2009, 14:53 
Аватара пользователя
Посмотрите внимательно, что будет в этом случае, если N=2, например. В этом случае до элемента с индексом 1 никогда дело не дойдёт (оператор div округляет в сторону нуля).

Вообще (не помню, кто сказал) двоичный поиск --- это такая вещь, которую никто никогда с первого раза правильно не напишет :)

 
 
 
 Re: Поиск в строке делением пополам (у Вирта ошибка?)
Сообщение19.06.2009, 06:47 
Аватара пользователя
Цитата:
Посмотрите внимательно, что будет в этом случае, если N=2, например. В этом случае до элемента с индексом 1 никогда дело не дойдёт (оператор div округляет в сторону нуля).


Да, все правильно, спасибо.

Цитата:
Вообще (не помню, кто сказал) двоичный поиск --- это такая вещь, которую никто никогда с первого раза правильно не напишет :)


тогда что насчет поиска Кнута-Морриса-Пратта?

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group