Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 1
Регистрация: 13.04.2009
Сообщений: 38

Алгоритм Бойера-Мура

07.12.2009, 23:03. Показов 3423. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем вся проблема состоит в том, что не могу объединить воедино обе эвристики.

Вот программа которая работает по эвристике стопсимвола:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
program Z;
uses crt;
var
str, std: string;
m, s: byte;
n:array [0..255] of integer;
type
  TBMTable = array [0..255] of Integer;
 
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[Byte(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;
 
begin
readln(str);             //строка в которой ищем
readln(std);             //строка которую ищем
MakeBMTable(n, std);
m:=BMSearch(s, str, std, n);;
writeln(m);
end.
а вот финкции которые были мной найдены и как бы должны работать по эвристике суффикса
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
type
  TIntVect = array [0..255] of Integer;
  TBMTable = array [0..0] of TIntVect;
  PBMTable = ^TBMTable;
function FindRightmost( const S, P : String;
  n : Integer) : Integer;
var
  i, j, lp : Integer;
begin
  Result := 0;
  lp := Length(P);
  if lp > n then Exit;
  for i := n - lp + 1 downto 1 do
  for j := 1 to lp do
  if P[j] <> S[i+j-1] then Break
  else if j = lp then
  begin
    Result := i;
    Exit;
  end;
end;
procedure MakeBMTable( var BMT : PBMTable; const P : String);
var
  i, j, lp, MaxShift, CurShift, SufPos : Integer;
  Suffix : String;
begin
  lp := Length(P);
  GetMem(BMT, SizeOf(TIntVect)*lp);
  for i := 0 to 255 do BMT^[lp-1][i] := lp;
  for i := lp downto 1 do
  if BMT^[lp-1][Byte(P[i])] = lp then
  BMT^[lp-1][Byte(P[i])] := lp - i;
  MaxShift := lp;
  for i := lp - 1 downto 1 do
  begin
    SetLength(Suffix, lp - i);
    Move(P[i+1], Suffix[1], lp - i);
    if Pos(Suffix, P) = 1 then MaxShift := i;
    for j := 0 to 255 do
    begin
      CurShift := MaxShift;
      SetLength(Suffix, lp - i + 1);
      Suffix[1] := Char(j);
      Move(P[i + 1], Suffix[2], lp - i );
      SufPos := FindRightmost(P, Suffix, lp - 1);
      if SufPos <> 0 then CurShift := i - SufPos;
      BMT^[i-1][j] := CurShift;
    end;
    BMT^[i-1][Byte(P[i])] := 0;
  end;
end;
function BMSearch( StartPos, lp : Integer; const S : String;
  BMT : PBMTable) : Integer;
var
  Pos, i : Integer;
begin
  Pos := StartPos + lp -1;
  while Pos < Length(S) do
  for i := lp downto 1 do
  if BMT^[i-1][Byte(S[Pos-lp+i])] <> 0 then
  begin
    Pos := Pos + BMT^[i-1][Byte(S[Pos-lp+i])];
    Break;
  end
  else if i = 1 then
  begin
    Result := Pos - lp + 1;
    Exit;
  end;
  Result := 0;
end;
В эвристике суффикса я так и не разобрался, поэтому и не могу понять как это все связать воедино. Если кто может, помогите!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.12.2009, 23:03
Ответы с готовыми решениями:

Просьба помочь разобраться с поиском в строке по алгоритму Бойера-Мура
Здравствуйте, уважаемые форумчане. Пытаюсь реализовать программу на Паскале, которая будет подсчитывать количество вхождений символов...

Алгоритм Боуера-Мура и поставить счётчик(сколько символов сравнения было) Поиск в таблице без ключа
помогите с решением пожалуйста Алгоритм Боуера-Мура и поставить счётчик(сколько символов сравнения было) Поиск в таблице без ключа ...

Есть ли ошибки в алгоритме Бойера-Мура
Есть ли ошибки в этом варианте алгоритма и можно ли его улучшить? Procedure Seacrh; Var i, j, jump, v, q: Integer; Begin ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.12.2009, 23:03
Помогаю со студенческими работами здесь

Алгоритм грубой силы или алгоритм Бойера-Мура
Составить алгоритм поиска заданного слова в тексте. Слово и текст являются массивами символов заданной длины. Если заданное слово...

Алгоритм Бойера — Мура
Ребят, помогите, кто чем может, для курсовой очень надо(( если есть какие-то предложения, пишите здесь 1)алгоритм Бойера — Мура...код...

Алгоритм Бойера — Мура
Люди добрые помогите с задачей! Необходимо Алгоритмом Бойера — Мура найди вхождения строки в строку.Строка состоит из случайных...

алгоритм Бойера-Мура
Всем привет! Помогите исправить ошибку пожалуйста! unit Unit1; interface uses Windows, Messages, SysUtils,...

Алгоритм Бойера — Мура
Доброго времени суток, нет ли у кого-нибудь примера реализации алгоритма Бойера — Мура. Искал в интернете, но там в основном теория,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru