Алгоритм поиска строк, который возвращает рекурсивные совпадения - Java - PullRequest
1 голос
/ 17 января 2012

Алгоритм поиска Рабина-Карпа работает нормально, но кто-нибудь может помочь мне изменить его на рекурсивный поиск? http://algs4.cs.princeton.edu/53substring/RabinKarp.java.html. Например:

 *  **pattern:** rar
 *  **text:**    abacadabrararbracabrarararacadabrabrarbracad 
 *  **match1:**          rar               
 *  **match2:**            rar
 *  **match3:**                     rar
 *  **match4:**                       rar
 *  **match5:**                         rar
 *  **match5:**                                     rar

Существуют ли другие более быстрые алгоритмы для поиска рекурсивного соответствия текста?

РЕШЕНИЕ

Добавить внешнюю библиотеку из http://johannburkard.de/software/stringsearch/ для построения пути. Код ниже вернет все стартовые позиции матчей. включая встроенные, такие как match1 и match2.

import com.eaio.stringsearch.BNDM;

String pattern = "rar";
String text = "abacadabrararbracabrarararacadabrabrarbracad";

// Loop through text to get starting position of matched pattern.
List<Integer> matchPoint =new ArrayList<Integer>();
int slice = -1;
while (slice<text.length()){
    slice+=1;
    com.eaio.stringsearch.BNDM result = new BNDM();
    int pos = result.searchString(text, slice, pattern);
    if (pos != -1) {
        slice = pos;
        matchPoint.add(pos);
    }
}

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Конечно, есть.Я не буду рекомендовать использование Rabin-Karp в случае поиска небольшого шаблона в строке.KMP, т. Е. Алгоритм Кнута-Морриса-Пратта, требует линейного времени и дополнительной линейной памяти и может возвращать все совпадения без случаев столкновений, которые возникают при работе с Рабином-Карпом.Пожалуйста, прочитайте вики для этого.Этот алгоритм немного сложнее для понимания, но он короче кода, и как только вы все сделаете правильно, вы будете очень довольны.

1 голос
/ 17 января 2012

Для более длинных паттернов алгоритм Бойера-Мура или такие варианты, как алгоритм Хорспула , как правило, быстрее. Алгоритм Бойера-Мура не особенно подходит для больших алфавитов. Если текст может быть полным диапазоном Unicode, он будет использовать довольно большую таблицу сдвига, но если текст ASCII или latin1, дополнительное пространство для таблиц поиска невелико. Для больших алфавитов я также рекомендую KMP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...