Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Пожалуйста перепишите этот текст из ObjectPaskal (Paskal) в

Автор: BOISman
Дата сообщения: 15.10.2002 20:03
type
TBMTable = array [0..255] of Integer;


Далее приводится процедура, вычисляющая таблицу смещений для образца P.

procedure MakeBMTable( var BMT : TBMTable; const P : String);
var
i : Integer;
begin
for i := 0 to 255 do BMT[i] := Length(P);
for i := Length(P) downto 1 do
if BMT[Byte(P[i])] = Length(P) then
BMT[Byte(P[i])] := Length(P) – i;
end;


Теперь напишем функцию, осуществляющую поиск.

function BMSearch( StartPos : Integer; const S, P : String;
const BMT : TBMTable) : Integer;
var
Pos, lp, i : Integer;
begin
lp := Length(P);
Pos := StartPos + lp –1;
while Pos < Length(S) do
if P[lp] <> S[Pos] then Pos := Pos + BMT[S[Pos]]
else for i := lp - 1 downto 1 do
if P[i] <> S[Pos – lp + i] then
begin
Inc(Pos);
Break;
end
else if i = 1 then
begin
Result := Pos – lp + 1;
Exit;
end;
Result := 0;
end;


Функция BMSearch возвращает позицию первого символа первого вхождения образца P в строке S. Если последовательность P в S не найдена, функция возвращает 0 (напомню, что в ObjectPascal нумерация символов в строке String начинается с 1). Параметр StartPos позволяет указать позицию в строке S, с которой следует начинать поиск. Это может быть полезно в том случае, если вы захотите найти все вхождения P в S. Для поиска с самого начала строки следует задать StartPos равным 1. Если результат поиска не равен нулю, то для того, чтобы найти следующее вхождение P в S, нужно задать StartPos равным значению «предыдущий результат плюс длина образца».
Автор: ion5
Дата сообщения: 16.10.2002 03:37
Если не ошибаюсь, то это поиск подстроки в строке?
Если так, то я сравнивал этот алгоритм с алгоритмом Кнутта,Мориса и Пратта(так помоему). Так вот - он быстрее почти в два раза. Советую вам сравнить эти 2 алгоритма и выбрать лучший.
Автор: BOISman
Дата сообщения: 16.10.2002 14:44
[b]ion5[/b]
Чтобы сравнить - нужно написать на си.
Как такое понимать: BMT[S[Pos]] (в си)?
Автор: f_serg
Дата сообщения: 17.10.2002 06:46
BOISman

Цитата:
Как такое понимать: BMT[S[Pos]] (в си)?

Да так же и понимать.
S[Pos] - символ или число от 0 до 255.
Вполне укладывается в границы массива.

Страницы: 1

Предыдущая тема: COM порт


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.