Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с поиском!

2.3K
03 октября 2005 года
mindguru
5 / / 23.12.2002
Уважаемые коллеги! Помогите плз найти алгоритм (подскажите идею) быстрого поиска строки в ЛЮБОМ (в т.ч. бинарном) файле. Варианты TStringList просьба не предлагать.
5
03 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by mindguru
Уважаемые коллеги! Помогите плз найти алгоритм (подскажите идею) быстрого поиска строки в ЛЮБОМ (в т.ч. бинарном) файле. Варианты TStringList просьба не предлагать.



А если КМП ?
Грузим файл в память, а дальше как ооочень длиную строку парсим КМП-шником... :)

2.3K
03 октября 2005 года
mindguru
5 / / 23.12.2002
Цитата:
Originally posted by hardcase
А если КМП ?
Грузим файл в память, а дальше как ооочень длиную строку парсим КМП-шником... :)



Ну типа да, токо я не знаю, шо такое КМП, а так всё нармальна!

5
03 октября 2005 года
hardcase
4.5K / / 09.08.2005
поиск подстроки в каком угодно файле
Код:
uses
     StrUtils;

var LongString: string;
    SubString: string;
    Position: integer;
    Stream: TStream;

Stream:=TFileStream.Create(FileName,fmOpenRead)
SetString(LongString,Stream.Size);
Stream.Read(PChar(LongString)^,Stream.Size);
Stream.Free;

Position:=PosEx(LongString,SubString);
while Position>0 do begin
  We_Found_Str_At_Position(Position);
  Position:=PosEx(LongString, SubString, Position+Length(SubString));
end;

PosEx - использует алгоритм КМП (Кнута и друзей) поиска подстроки
2.3K
03 октября 2005 года
mindguru
5 / / 23.12.2002
Цитата:
Originally posted by hardcase
поиск подстроки в каком угодно файле

PosEx - использует алгоритм КМП (Кнута и друзей) поиска подстроки



Да... Хитрый алгоритм! А 10М тоже прикажете в память одной строкой? Умники, блин...

5
04 октября 2005 года
hardcase
4.5K / / 09.08.2005
Цитата:
Originally posted by mindguru
Да... Хитрый алгоритм! А 10М тоже прикажете в память одной строкой? Умники, блин...


Система всё равно в своп будет скидывать память. В хелпах по делфи сказано - стринг может иметь размер до 2ГБ - Как ты думаешь, где он будет лежать?
А если хочешь еффективности - можно написать посиковик самому - в нете полно спецификаций КМП:
http://www.codenet.ru/progr/alg/kmp.php
http://ric.uni-altai.ru/Fundamental/pascal1/lab15/l15-teor.htm
В общих чертах: 8)
Грузишь страницу в пару метров, ищешь в ней, потом следущую, правда на стыках предётся попотеть...

5
04 октября 2005 года
hardcase
4.5K / / 09.08.2005
Вот примерный вариант: Он не требует загрузки большого файла в память.

Код:
const
  PageSize: integer = 1048576; //1MB

var
  Stream: TStream;
  StrmPos: Int64;
  Posit: integer;
  Buffer: string;
  BufSize: Int64;

while StramPos<Stream.Position do begin
  BufSize:=Min(PageSize,Stream.Size-Stream.Position);
  SetString(Buffer,BufSize);
  Stream.Read(PChar(Buffer)^,BufSize);
  Posit:=PosEx(Buffer,SubStr);
  while Posit>0 do begin
      We_Found_Str_At_Position(StrmPos+Posit);
      Posit:=PosEx(Buffer,SubStr,Posit+Length(SubStr));
  end;  
  Stream.Position:=Position-Length(SubStr)+1;
end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог