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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2011, 01:45   #1
Lodas
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 61
По умолчанию как работает эта программа(Алгоритм Рабина-Карпа с++)???

Привет всем. Столкнулся с задачей разобраться с кодом алгоритма рабина карпа. Объясните пожалуйста как в данной программе он работает.
Код:
/* Рабина-Карпа строку алгоритме сопоставления
  - Предположим, Т и Р состоит только а до я и А. Z..
  - проверка является ли P подстрокой Т
  - Вернуть начальный индекс первого вхождения P в T
  - m = длина (Т)
  - n = длина (Р)
      Худший случай: ((п-т +1) * м)
      Лучший случай: (п + т)
*/
//---------------------------------------------------------------------------
#define tonum(c) (c >= 'A' && c <= 'Z' ? c - 'A' : c - 'a' + 26)
 
  /* return a^p mod m */
  int mod(int a,int p,int m)
  {
       if (p == 0) return 1;
       int sqr = mod(a,p/2,m) % m;
       sqr = (sqr * sqr) % m;
       if (p & 1) return ((a % m) * sqr) % m;
       else return sqr;
  }
 
  int RabinKarpMatch(char *T,char *P,int d,int q)
  {
       int i,j,p,t,n,m,h,found;
       n = strlen(T);
       m = strlen(P);
       h = mod(d,m-1,q);
       p = t = 0;
 
   for (i=0; i<m; i++)
       {
            p = (d*p + tonum(P[i])) % q;
            t = (d*t + tonum(T[i])) % q;
       }
 
   for (i=0; i<=n; i++)
       {
            if (p == t)
            {
                 found = 1;
                 for (j=0; j<m; j++)
                     if (P[j] != T[i+j])
                     {
                         found = 0;
                         break;
                     }
                 if (found) return i+1;
            } else {
                 t = (d*(t - ((tonum(T[i])*h) % q)) + tonum(T[i+m])) % q;
            }
       }
       return -1;
  }
#pragma argsused
int main(int argc, char* argv[])
{     int sovp;
      int d=1, q=1;
      char *T="Kachdii den iya vstay na yaseby";
      char *P="den";
      cout<<"             Algoritm Rabina-Karpa\n"<<"\n----------------------------------\n";
      cout<<"Kachdii den iya vstay na yseby i idy v BGTY\n\n";
      cout<<"Find-->den\n\n";
      sovp= RabinKarpMatch(T,P,d, q);
      if(sovp)
      cout<<"Slovo naideno v "<<sovp<<" posizii";
      else
      cout<<"Sovpadenii ne naideno!!!";
      getch();
      return 0;
}
//------------------------------------
Lodas вне форума Ответить с цитированием
Старый 18.12.2011, 11:58   #2
Lodas
Пользователь
 
Регистрация: 20.05.2010
Сообщений: 61
По умолчанию

Что за времена нынче пошли. Раньше обращались на форум и хоть как то помогали. может время другое настало? или модераторы сменились?
Lodas вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Карпа-Рабина [JScript] dixonich Помощь студентам 3 28.11.2010 22:04
Алгоритм Карпа-Рабина [JScript] dixonich Помощь студентам 0 25.11.2010 21:46
Алгоритм Кнута-Морриса-Пратта или Рабина-Карпа (язык С++). Может у кого-нибудь есть готовый рабочий ? Беата Помощь студентам 7 27.03.2010 10:50
алгоритм рабина-карпа(поиск подстроки) kristy42 Помощь студентам 0 03.11.2009 18:41
Алгоритмы Рабина - Карпа Volchara Общие вопросы C/C++ 0 24.04.2009 16:40