2012-01-17 2 views
1

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

* **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); 
    } 
} 
+0

У вас есть опыт преобразования итеративного кода в рекурсивный код, для общего случая? –

+0

nope, обычно я просто помещаю 'pattern' в функцию и вызываю поиск до тех пор, пока функция не ответит на конец' text' – alvas

+1

Ну, вы немного в правильном направлении. Идея состоит в том, чтобы разбить проблему на то, что одна итерация решает две или более проблемы, а затем решает проблему с другим рекурсивным вызовом. Это основной принцип. –

ответ

2

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

+0

Я попытался запустить этот модуль KMP в свой код, и у меня закончилась недостаточная проблема с памятью. http://www.fmi.uni-sofia.bg/fmi/logic/vboutchkova/sources/KMPMatch_java.html. Есть ли еще какие-то простые методы сохранения памяти для строкового поиска, я пробовал BNDM из http://johannburkard.de/software/stringsearch/, но это слишком много, чтобы перекодировать, и мои инструкции для моего проекта состояли в том, чтобы сохранить строку поиск простой одновременно время/память неиспользованный. Какие-либо предложения? – alvas

+0

Это немного хлопотно - если у вас не хватает памяти для алгоритма, который занимает вдвое больше памяти, чем сам вход (или даже значительно меньше, если шаблон меньше, чем строка для поиска). Вероятно, более вероятно, что у вас плохие настройки виртуальной машины Java. Теперь мне еще больше нужно помочь вам, поскольку я узнал, что мы приехали из того же университета: P –

+0

=) Борис, вы из НТУ или УдС? хахаха. Я сделал рекурсивный Rabin-Karp, и он тоже выходит из проблем с памятью. Я решил проблему, выполнив BNDM algo. Но это все еще не так быстро, как если бы я использовал API от http://johannburkard.de/software/stringsearch/ – alvas

1

Для более длинных узоров Boyer-Moore algorithm или варианты, такие как Horspool's algorithm, как правило, быстрее. Алгоритм Boyer-Moore особенно не подходит для больших алфавитов. Если текст может быть полным диапазоном Юникода, он будет использовать довольно большую таблицу сдвига, но если текст ASCII или latin1, дополнительное пространство для таблиц поиска мало. Для больших алфавитов я также рекомендую KMP.

Смежные вопросы