Здраствуйте, хотел выяснить по поводу возможных вариантов организации поиска подстроки в большом файле. Как правило, из файла читают по n байт, а функциям поиска и pcre надо строку полностью скармливать, а не по частям, в этом порблема. Подскажите какие есть реализации и варианты алгоритма.
Re: Алгоритмы поиска точного вхождения строки в строку
Здравствуйте, Андрeй, Вы писали:
А>Здраствуйте, хотел выяснить по поводу возможных вариантов организации поиска подстроки в большом файле. Как правило, из файла читают по n байт, а функциям поиска и pcre надо строку полностью скармливать, а не по частям, в этом порблема. Подскажите какие есть реализации и варианты алгоритма.
Алгоритмы Бойера-Мура или Кнута-Морриса-Пратта. Для любого из них достаточно функции "дай мне очередной символ".
Д.К. << RSDN@Home 1.2.0 alpha rev. 668>>
Все на свете должно происходить медленно и неправильно...
Re[2]: Алгоритмы поиска точного вхождения строки в строку
Кнута-Морриса-Пратта у меня не собрался к сожалению. А реализации этой функции типа дай мне следующий символ есть? ну или идеи как это сделать? вобще было бы круто такую функцию для пцре...
Re[3]: Алгоритмы поиска точного вхождения строки в строку
Здравствуйте, Андрeй, Вы писали:
А>Кнута-Морриса-Пратта у меня не собрался к сожалению. А реализации этой функции типа дай мне следующий символ есть? ну или идеи как это сделать? вобще было бы круто такую функцию для пцре...
А какие сложности?
Мы читаем из файла по N байт в буфер. Храним позицию символа, который надо отдать, относительно начала буфера. Если буфер не кончился, отдаем очередной символ, иначе читаем из файла очередную порцию и обнуляем позицию.
Здравствуйте, conraddk, Вы писали:
C>А к pcre ее по-простому не приделать, потому что для регэкспов требуются возвраты к ранее просмотренным частям строки.
Можно использовать из Boost.Spirit реализацию multi_pass итератора — он запоминает некоторое количество пройденых символов.
Sapienti sat!
Re: Алгоритмы поиска точного вхождения строки в строку
Здравствуйте, Cyberax, Вы писали:
C>Здравствуйте, conraddk, Вы писали:
C>>А к pcre ее по-простому не приделать, потому что для регэкспов требуются возвраты к ранее просмотренным частям строки. C>Можно использовать из Boost.Spirit реализацию multi_pass итератора — он запоминает некоторое количество пройденых символов.