Форум программистов, компьютерный форум CyberForum.ru

Алгоритм Кнута, Морриса и Пратта - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
rostik123456789
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
10.01.2013, 15:42     Алгоритм Кнута, Морриса и Пратта #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
//описание функции алгоритма Кнута, Морриса и Пратта
int KMPSearch(char *string, char *substring){
  int  sl, ssl;
  int res = -1;
  sl = strlen(string);
  ssl = strlen(substring);
  if ( sl == 0 ) 
    cout << "Неверно задана строка\n"; 
  else if ( ssl == 0 ) 
    cout << "Неверно задана подстрока\n"; 
  else {
    int  i, j = 0, k = -1;
    int  *d;
    d = new int[1000];
    d[0] = -1;
    while ( j < ssl - 1 ) {
      while ( k >= 0 && substring[j] != substring[k] ) 
        k = d[k];
      j++;
      k++;
      if ( substring[j] == substring[k] )
        d[j] = d[k];
      else 
        d[j] = k;
    }
    i = 0;
    j = 0;
    while ( j < ssl && i < sl ){
      while ( j >= 0 && string[i] != substring[j] )
        j = d[j];
      i++;
      j++;
    }
    delete [] d;
    res =  j == ssl ? i - ssl : -1;
  }
  return res;
}
Может кто-то объяснить что и как происходит в этом коде, я почему-то не очень понимаю, но хочу понять, что происходит в коде.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.01.2013, 15:42     Алгоритм Кнута, Морриса и Пратта
Посмотрите здесь:

C++ Алгоритм
Алгоритм Кнута-Морриса-Пратта C++
алгоритм C++
алгоритм C++
C++ Алгоритм поиска по строке Кнута-Морриса-Пратта
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FlaYnoSt
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
10.01.2013, 16:06     Алгоритм Кнута, Морриса и Пратта #2
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
int KMPSearch(char *string, char *substring){ //в качестве параметров в функцию передается строка и субстрока
  int  sl, ssl;
  int res = -1;
  sl = strlen(string);                                            //присваивается длина строки
  ssl = strlen(substring);                                      //присваивается длина субстроки
  if ( sl == 0 )                                                    //проверка строки
    cout << "Неверно задана строка\n"; 
  else if ( ssl == 0 )                                            //проверка субстроки
    cout << "Неверно задана подстрока\n"; 
  else {                                                            //Если все нормально - поехали
    int  i, j = 0, k = -1;
    int  *d;
    d = new int[1000];                                         //создали динамический одномерный массив
    d[0] = -1;                                                    //первый элемент делаем равным -1
    while ( j < ssl - 1 ) {                                      //пока  j < кол-ва эл-тов строки
      while ( k >= 0 && substring[j] != substring[k] ) /*пока k больше или равно 0 и j-тый элемент субстроки не равен
                                                                     k-тому присваиваем k k-тый элемент динамического массива*/
        k = d[k];                                                 
      j++;                                                         //увеличиваем j
      k++;
      if ( substring[j] == substring[k] )                   //если j-ый элемент субстроки равен k-тому
        d[j] = d[k];                                             //присваиваем j-тому элементу динамического массива k-тый
      else                                                         //иначе
        d[j] = k;                                                 //присваиваем k
    }
    i = 0;
    j = 0;                                                         //обнулили i, j
    while ( j < ssl && i < sl ){                               //пока j < длины субстроки и i < длины строки
      while ( j >= 0 && string[i] != substring[j] )       // пока j >= 0 и i-ый элемент субстроки не равен j-ому
        j = d[j];                                                  //j присваивается j-ый элемент динамического массива
      i++;
      j++;                                                         //увеличиваем i и j
    }
    
    
    delete [] d;                                                 //удаляем динам. массив                                                
    res =  j == ssl ? i - ssl : -1;                           // результатом будет i-ssl если j = ssl и -1 в противном случае
  }
  return res;
}
rostik123456789
0 / 0 / 0
Регистрация: 30.09.2012
Сообщений: 25
10.01.2013, 16:35  [ТС]     Алгоритм Кнута, Морриса и Пратта #3
Возможно я неправильно подал свой ​​вопрос, я хочу понять этот алгоритм но не знаю как правильно задать вопрос чтобы вы мне немножко его объяснили, до этого кода я бы хотел, чтобы вы написали алгоритм его работы (не комментарии к коду) чтобы я понял как он работает , т.е. как работает этот код.
FlaYnoSt
0 / 0 / 0
Регистрация: 10.01.2013
Сообщений: 18
10.01.2013, 16:42     Алгоритм Кнута, Морриса и Пратта #4
http://ru.wikipedia.org/wiki/%D0%90%...82%D1%82%D0%B0
http://algolist.manual.ru/search/esearch/kmp.php
http://www.avhohlov.narod.ru/p2250ru.htm

Мельком глянул, вроде то
Yandex
Объявления
10.01.2013, 16:42     Алгоритм Кнута, Морриса и Пратта
Ответ Создать тему
Опции темы

Текущее время: 06:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru