Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2017, 17:03   #1
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию Прокомментировать код (Алгоритм Бойера — Мура)

Добрый день, искал различные методы поиска подстроки в строке и наткнулся на Алгоритм Бойера — Мура, в принципе работа алгоритма понятна, начал искать реализацию и вот что нашел:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int BMSearch(char *string, char *substring){
  int  sl = 0;
  int ssl = 0;
  int res = -1;
  while (string[sl] != NULL) {
  		sl++;
  }
  while (substring[ssl] != NULL) {
  		ssl++;
  }
  if (sl == 0) 
    printf("Некорректная строка\n"); 
  else if (ssl == 0) 
    printf("Некорректная подстрока\n"); 
  else {
    int  i, Pos;
    int  BMT[256];
    for (i = 0; i < 256; i ++)
      BMT[i] = ssl;
    for (i = ssl-1; i >= 0; i--)
      if (BMT[(short)(substring[i])] == ssl) 
        BMT[(short)(substring[i])] = ssl - i - 1;
    Pos = ssl - 1;
    while (Pos < sl)
      if (substring[ssl - 1] != string[Pos])
        Pos = Pos + BMT[(short)(string[Pos])];
      else 
        for (i = ssl - 2; i >= 0; i--){
          if (substring[i] != string[Pos - ssl + i + 1]) {
            Pos += BMT[(short)(string[Pos - ssl + i + 1])] - 1;
            break;
          }
          else
            if (i == 0)
              return Pos - ssl + 1;
        }
  }
  printf("\n");
  return res;
}

int main(int argc, char *argv[]) {
	setlocale (LC_ALL, "Rus");
	char str[30];
	char substr[30];
	printf("Введите строку: ");
	scanf("%s", str);
	printf("Введите подстроку: ");
	scanf("%s", substr);
	
	int pos = BMSearch(str, substr);
	printf("Смещение = %d", pos);
		
	return 0;
}
Не могли бы вы описать мне, что происходит в данном куске кода:
Код:
    int  i, Pos;
    int  BMT[256];
    for (i = 0; i < 256; i ++)
      BMT[i] = ssl;
    for (i = ssl-1; i >= 0; i--)
      if (BMT[(short)(substring[i])] == ssl) 
        BMT[(short)(substring[i])] = ssl - i - 1;
    Pos = ssl - 1;
    while (Pos < sl)
      if (substring[ssl - 1] != string[Pos])
        Pos = Pos + BMT[(short)(string[Pos])];
      else 
        for (i = ssl - 2; i >= 0; i--){
          if (substring[i] != string[Pos - ssl + i + 1]) {
            Pos += BMT[(short)(string[Pos - ssl + i + 1])] - 1;
            break;
          }
          else
            if (i == 0)
              return Pos - ssl + 1;
        }
Заранее спасибо, очень благодарен вам
EDWIN503 вне форума Ответить с цитированием
Старый 28.10.2017, 18:44   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Если ты хочешь разобраться как работает код, то тебе надо просто по-шагово его выполнить (на конкретном примере выполнить).
Т.е. прими какие-то условия, например:
Код:
string = "sdgshju dgjdfg fvbsfjh dfdsgjgdn dgh"
substring = "fdsg"
и, у себя на бумажке, пройди код.
При этом записывай как меняются переменные и их анализируй...
Если с первого раза не получилось - пройди повторно... Со временем понимание придёт...

Ты же знаешь, что в С++ строка сохраняется как обычный массив типа "char"?
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 19:05   #3
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
Если ты хочешь разобраться как работает код, то тебе надо просто по-шагово его выполнить (на конкретном примере выполнить).
Т.е. прими какие-то условия, например:
Код:
string = "sdgshju dgjdfg fvbsfjh dfdsgjgdn dgh"
substring = "fdsg"
и, у себя на бумажке, пройди код.
При этом записывай как меняются переменные и их анализируй...
Если с первого раза не получилось - пройди повторно... Со временем понимание придёт...

Ты же знаешь, что в С++ строка сохраняется как обычный массив типа "char"?
Я не понимаю эту часть кода, не могли бы вы подсказать мне?
Код:
if (BMT[(short)(substring[i])] == ssl)
Конкретно интересует часть в квадратных скобках:
Код:
[(short)(substring[i])]
Подскажите, что делает этот код?
EDWIN503 вне форума Ответить с цитированием
Старый 28.10.2017, 19:55   #4
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Посмотри на описание массива: "BMT[256];"... Чтобы обратится к "115-му" элементу нужно написать "BMT[115]", где "115" - это целое число (а не символ 's')...

А теперь теория: в с++ между символом "char" и "int" есть связь. Или, по другому, один и тот же символ можно приставить и как целое число и как символ. Это называется таблица ASCII:


1.jpg


Обычно я использовал это свойство, когда нужно подсчитать кол-во каждого символа в строке : "tdgfr tt rr t". Создаёшь массив "int" из 256 символов (Подумай, а почему именно из 256 символов?) и каждой ячейки сохраняешь сумму. Например A[115] - это для хранения кол-ва встречения буквы 's', а A[111] - счётчик для 'o' и т.д.

Возьми поиграйся с выводом разных значений: и таких (short)(substring[i]) - кстате, какой у этого выражения тип на выходе (для вывода нужно указать)?
(ну раз массив int BMT[int]???)
и другого вида...

https://www.youtube.com/watch?v=4XX-...ature=youtu.be

Последний раз редактировалось ura_111; 28.10.2017 в 20:09.
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 19:57   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Не дописал таблицу:

2.jpg


Подумай, почему именно вектор из 256 элементов?

Последний раз редактировалось ura_111; 28.10.2017 в 20:01.
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 20:07   #6
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Еще один вопрос: эквиваленты ли записи
Код:
int a=1;
char b= '1';
а так:

Код:
int a=49;
char b= '1';
????
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 20:54   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Понимаешь, в Си есть такая тема как "приведение типов" - это когда из одного типа делается другой (если это возможно).
Например, из "doube" в "int" или вот пример:



2.jpg


После приведения, выполняются арифметические действия (хотя изначально С- это char)...

Наверное, в строчке "[(short)(substring[i])]" надо поменять "short" на "int" и тогда будет нормально смотреться, - ведь "BMT[int]".

А ну пробуй, заработает программа?

Последний раз редактировалось ura_111; 28.10.2017 в 20:57.
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 20:59   #8
EDWIN503
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 15
По умолчанию

Да, заработала, в принципе, если не ставить ничего, ни short, ни int, то тоже работает
EDWIN503 вне форума Ответить с цитированием
Старый 28.10.2017, 21:03   #9
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

может быть "явное" и "не явное" преобразование типов. В последнем случае компилятор сам решает стоить это делать или нет (от контекста).



3.jpg
ura_111 вне форума Ответить с цитированием
Старый 28.10.2017, 21:08   #10
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Но с этим нужно быть осторожным...
За типами нужно следить, потому что появляются ошибки: например ты присвоил:
Код:
bouble a=6.88;
int b= a;
всё... после запятой всё пропало.

Понимаешь?
ura_111 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм Бойлера-Мура KatyaKatch Общие вопросы C/C++ 1 03.11.2014 15:32
C++Проверить код и прокомментировать Kseni564 Помощь студентам 0 11.05.2014 16:02
Помогите понять код (прокомментировать код шифрации на C++). bicks Помощь студентам 3 10.12.2013 21:31
Автоматы Бойера- Мура killer12rus Помощь студентам 1 21.12.2010 20:55
Просьба помочь разобраться с поиском в строке по алгоритму Бойера-Мура Ветас Помощь студентам 1 16.11.2009 18:52