Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
THE HOST

Очень прошу разъяснить код алгоритма Бойера-Мура

30.05.2012, 20:40. Показов 5832. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
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
72
73
#include <cstdlib>
#include <iostream>
#include <string>
 
#define ALPHABET_LEN 255 
#define NOT_FOUND patlen 
#define max(a, b) ((a < b) ? b : a)
 
using namespace std;
 
void make_delta1 (int *delta1, char *pat, long int patlen) {
 int i;
 for (i=0; i < ALPHABET_LEN; i++) delta1[i] = NOT_FOUND;
 for (i=0; i < patlen-1; i++) delta1[pat[i]] = patlen-1-i;
}
 
int is_prefix (char *word, int wordlen, int pos) {
 int suffixlen = wordlen - pos;
 for (int i = 0; i<suffixlen; i++) {
  if (word[i] != word[pos+i]) return 0;
 }
 return 1;
}
int suffix_length (char *word, int wordlen, int pos) {
 int i;
 for (i = 0; (word[pos-i] == word[wordlen-1-i]) && (i < pos); i++);
 return i;
}
 
void make_delta2(int *delta2, char *pat, long int patlen) {
 int last_prefix_index = patlen-1;
 int p;
 for (p=patlen-1; p>=0; p--) {
  if (is_prefix(pat, patlen, p+1)) last_prefix_index = p+1;
  delta2[p] = last_prefix_index + (patlen-1 - p);
 }
 for (p=0; p < patlen-1; p++) {
  int slen = suffix_length(pat, patlen, p);
  if (pat[p-slen]!=pat[patlen-1-slen]) delta2[patlen-1-slen]=patlen-1-p+slen;
 }
}
 
char *boyer_moore (char *string, char *pat) {
 long int stringlen = strlen(string);
 long int patlen =strlen(pat);
 int delta1[ALPHABET_LEN];
 make_delta1(delta1, pat, patlen);
 int *delta2 = new int [patlen * sizeof(int)];
 make_delta2(delta2, pat, patlen);
 int i = patlen-1;
 while (i < stringlen) {
  int j = patlen-1;
  while (j >= 0 && (string[i] == pat[j])) {
   --i; --j;
  }
  if (j < 0) {
   delete delta2;
   return string+i+1;
  }
  i += max(delta1[string[i]], delta2[j]);
 }
 delete delta2;
 return NULL;
}
 
int main()
 {
 char *string="This is a test string for my test program";
 char *pattern="test";
 cout << "Result=" << boyer_moore(string,pattern) << endl;   
 system("PAUSE");
 return EXIT_SUCCESS;
}
Помогите, пожалуйста, разобраться!!! Мне нужно защитить этот код, но я не могу разобрать некоторые строки!
C++
1
#define max(a, b) ((a < b) ? b : a)
- для чего нужна эта строка? //я понимаю, что это условная операция, но какую роль она выполняет в коде?
int suffixlen = wordlen - pos;- что обозначает эта строка?
C++
1
 i += max(delta1[string[i]], delta2[j]);
- что делает эта строка?
C++
1
int *delta2 = new int [patlen * sizeof(int)]
- и вот эта строка?
P.S. да, я совсем ничего не понимаю в С++!
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.05.2012, 20:40
Ответы с готовыми решениями:

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

Алгоритм Бойера и Мура
Добрый день! Помогите пожалуйста написать на С++ алгоритм Бойера и Мура Добавлено через 7 часов 41 минуту Пожалуйста помогите

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

1
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
30.05.2012, 20:46
Цитата Сообщение от THE HOST Посмотреть сообщение
#define max(a, b) ((a < b) ? b : a)
макрос возвращает максимальное из двух значений.
Цитата Сообщение от THE HOST Посмотреть сообщение
int suffixlen = wordlen - pos;- что обозначает эта строка?
новой переменной suffixlen присваивается разность worldlen и pos
Цитата Сообщение от THE HOST Посмотреть сообщение
i += max(delta1[string[i]], delta2[j]); - что делает эта строка?
к переменной i прибавляется максимальное из элементов массивов.
Цитата Сообщение от THE HOST Посмотреть сообщение
int *delta2 = new int [patlen * sizeof(int)] - и вот эта строка?
новому указателю выделяется динамическая память размером patlen умноженным на размер целого числа

Добавлено через 1 минуту
THE HOST,

Не по теме:

оформляйте код в соответствующие теги форматирования.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.05.2012, 20:46
Помогаю со студенческими работами здесь

метод бойера-мура
Помогите найти ошибку...(в дельфи новичок).вот код.выдает ошибку(даже не ошибку,а выделяет фиолетовым цветом что то с памятью(строка с...

Алгоритм Бойера-Мура
Скиньте пожалуйста алгоритм Бойера-Мура

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

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

Упрощеный алгоритм Бойера-Мура
Здараствуйте. пытался реализовать упрощенный алгоритм Бойера-Мура. Но он не работает... Помогите найти ошибку. #include &lt;conio.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru