Алгоритмы поиска точного вхождения строки в строку
От: Андрeй Россия http://www.andrey.polyakov.name
Дата: 17.08.07 10:50
Оценка:
Здраствуйте, хотел выяснить по поводу возможных вариантов организации поиска подстроки в большом файле. Как правило, из файла читают по n байт, а функциям поиска и pcre надо строку полностью скармливать, а не по частям, в этом порблема. Подскажите какие есть реализации и варианты алгоритма.
Re: Алгоритмы поиска точного вхождения строки в строку
От: conraddk Россия  
Дата: 17.08.07 11:24
Оценка:
Здравствуйте, Андрeй, Вы писали:

А>Здраствуйте, хотел выяснить по поводу возможных вариантов организации поиска подстроки в большом файле. Как правило, из файла читают по n байт, а функциям поиска и pcre надо строку полностью скармливать, а не по частям, в этом порблема. Подскажите какие есть реализации и варианты алгоритма.

Алгоритмы Бойера-Мура или Кнута-Морриса-Пратта. Для любого из них достаточно функции "дай мне очередной символ".
Д.К. << RSDN@Home 1.2.0 alpha rev. 668>>
Все на свете должно происходить медленно и неправильно...
Re[2]: Алгоритмы поиска точного вхождения строки в строку
От: Андрeй Россия http://www.andrey.polyakov.name
Дата: 20.08.07 07:59
Оценка:
Кнута-Морриса-Пратта у меня не собрался к сожалению. А реализации этой функции типа дай мне следующий символ есть? ну или идеи как это сделать? вобще было бы круто такую функцию для пцре...
Re[3]: Алгоритмы поиска точного вхождения строки в строку
От: conraddk Россия  
Дата: 20.08.07 10:30
Оценка:
Здравствуйте, Андрeй, Вы писали:

А>Кнута-Морриса-Пратта у меня не собрался к сожалению. А реализации этой функции типа дай мне следующий символ есть? ну или идеи как это сделать? вобще было бы круто такую функцию для пцре...

А какие сложности?
Мы читаем из файла по N байт в буфер. Храним позицию символа, который надо отдать, относительно начала буфера. Если буфер не кончился, отдаем очередной символ, иначе читаем из файла очередную порцию и обнуляем позицию.
char buf[N];
int bufPos;
...
char getNextChar()
{
    if( bufPos >= N )
    {
        fillBuffer();
        bufPos = 0;
    }
    return buf[bufPos++];
}

А к pcre ее по-простому не приделать, потому что для регэкспов требуются возвраты к ранее просмотренным частям строки.
Д.К. << RSDN@Home 1.2.0 alpha rev. 668>>
Все на свете должно происходить медленно и неправильно...
Re[4]: Алгоритмы поиска точного вхождения строки в строку
От: Cyberax Марс  
Дата: 20.08.07 22:01
Оценка:
Здравствуйте, conraddk, Вы писали:

C>А к pcre ее по-простому не приделать, потому что для регэкспов требуются возвраты к ранее просмотренным частям строки.

Можно использовать из Boost.Spirit реализацию multi_pass итератора — он запоминает некоторое количество пройденых символов.
Sapienti sat!
Re: Алгоритмы поиска точного вхождения строки в строку
От: WolfHound  
Дата: 21.08.07 15:40
Оценка: +1
Здравствуйте, Андрeй, Вы писали:

Читай про memory mapped files.
... << RSDN@Home 1.2.0 alpha rev. 673>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Алгоритмы поиска точного вхождения строки в строку
От: Андрeй Россия http://www.andrey.polyakov.name
Дата: 08.10.07 11:03
Оценка:
короче по данному сабжу, регэкспы прикручиваются для этих целей, но хз как это правильно юзать.
http://www.rsdn.ru/forum/message/2682287.1.aspx
Автор: Андрeй
Дата: 05.10.07
Re[5]: Алгоритмы поиска точного вхождения строки в строку
От: Андрeй Россия http://www.andrey.polyakov.name
Дата: 08.10.07 11:04
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, conraddk, Вы писали:


C>>А к pcre ее по-простому не приделать, потому что для регэкспов требуются возвраты к ранее просмотренным частям строки.

C>Можно использовать из Boost.Spirit реализацию multi_pass итератора — он запоминает некоторое количество пройденых символов.

регэкспы прикручиваются для этих целей, но хз как это правильно юзать.
http://www.rsdn.ru/forum/message/2682287.1.aspx
Автор: Андрeй
Дата: 05.10.07
Re: Алгоритмы поиска точного вхождения строки в строку
От: Андрeй Россия http://www.andrey.polyakov.name
Дата: 09.10.07 10:56
Оценка:
Подскажите а через Boost какую функцию юзать?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.