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

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

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2011, 00:14   #1
videolord
Пользователь
 
Аватар для videolord
 
Регистрация: 23.02.2011
Сообщений: 28
По умолчанию Как работает префикс функция ?

Привет всем! это алгоритм Кнута-Моррисона-Пратта,нашел код,но ни как не вникаю в этом коде как работает префикс функция prefixFunction(), я знаю теорию и как мы вычисляем префикс функцию но как реализован на jave непонятно,можете комменты поставить в строках кода


Например для abacaba, P("abacaba",i)
P("abacaba", 1) = "a":0
P("abacaba", 2) = "ab":0
P("abacaba", 3) = "aba":1
P("abacaba", 4) = "abac":0
P("abacaba", 5) = "abaca":1
P("abacaba", 6) = "abacab":2
P("abacaba", 7) = "abacaba":3
получаем P("abacaba") =0010123


Код:
public class kmp {
  public static int[] prefixFunction(String s) {
  int n = s.length();
  int[] p = new int[n];
  for (int i = 1; i < n; i++) {
  int k = p[i - 1]; // зчем мы присваиваем p[i - 1]
   while (k > 0 && s.charAt(k) != s.charAt(i)){
    k=p[k - 1]; //и здесь?
   }
    p[i] = k + (s.charAt(k) == s.charAt(i) ? 1 : 0);
  }
     return p;
  } 

  public static int kmpMatcher(String s, String pattern) {
    int m = pattern.length();
    if (m == 0) {
      return 0;
    }
    int n = s.length();
    int[] p = prefixFunction(pattern);
    int k = 0;
    for (int i = 0; i < n; i++) {
      while (k > 0 && s.charAt(i) != pattern.charAt(k)) {
        k = p[k - 1];
      }
      if (s.charAt(i) == pattern.charAt(k)) {
        k++;
      }
      if (k == m) {
        return i - m + 1;
      }
    }
    return -1;
  }

  // Usage example
  public static void main(String[] args) {
	  String pattern="abacaba";
	  int[] p = prefixFunction(pattern);
	  for (int i=0;i<7;i++){
	  System.out.print(p[i]);
       }
 	  
}}

Последний раз редактировалось videolord; 14.04.2011 в 00:18.
videolord вне форума Ответить с цитированием
Старый 14.04.2011, 06:21   #2
videolord
Пользователь
 
Аватар для videolord
 
Регистрация: 23.02.2011
Сообщений: 28
По умолчанию

нашел еще пример но неясно как мы сравниваем между собой !

Для строки 'abcdabscabcdabia' вычисление будет таким:
'a'!='b' => π=0; 'a'!='c' => π=0; 'a'!='d' => π=0; 'a'=='a' => π=π+1=1; 'b'=='b' => π=π+1=2; 'c'!='s' => π=0; 'a'!='c' => π=0; 'a'=='a' => π=π+1=1; 'b'=='b' => π=π+1=2; 'c'=='c' => π=π+1=3; 'd'=='d' => π=π+1=4; 'a'=='a' => π=π+1=5; 'b'=='b' => π=π+1=6; 's'!='i' => π=0; 'a'=='a' => π=π+1=1;
videolord вне форума Ответить с цитированием
Старый 14.04.2011, 18:18   #3
legendary
Форумчанин
 
Аватар для legendary
 
Регистрация: 21.04.2010
Сообщений: 125
По умолчанию

вроде норм обяснено
Вложения
Тип файла: rar 2_Substring.rar (14.8 Кб, 55 просмотров)
legendary вне форума Ответить с цитированием
Старый 14.04.2011, 21:05   #4
videolord
Пользователь
 
Аватар для videolord
 
Регистрация: 23.02.2011
Сообщений: 28
По умолчанию

ваще не получается скачать
кто нить скиньте на файлообменник пожалуйста!
videolord вне форума Ответить с цитированием
Старый 15.04.2011, 17:17   #5
videolord
Пользователь
 
Аватар для videolord
 
Регистрация: 23.02.2011
Сообщений: 28
По умолчанию

Спасбо огромное legendary! Классная реализация!Теперь все понятно!
videolord вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает функция number_format? Nikirinka PHP 4 08.01.2011 16:50
функция eoln() не работает как надо Cannibal Помощь студентам 4 30.11.2010 12:58
функция Get Document не работает в CDialog. как получить документ в CDIalog MFCCasper Общие вопросы C/C++ 4 24.03.2010 15:06
Как передать префикс в HTTPRIO? Sasha_Sha Общие вопросы Delphi 0 28.04.2009 05:28
Объясните, как работает функция strlen() TheWanderer Общие вопросы C/C++ 9 25.11.2008 22:46