Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск строки в файле 
:(
    Опции темы
Voyager
Дата 8.2.2005, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Пишу программу. Есть проблема:
Есть нетипизированный файл. Есть строка длиной 18 байтов. Нужно найти эту строку в файле (или найти максимальную длину части строки, которая встречается в файле).
Вопрос думаю ясен.
Так вот, сделал я этот поиск, но уж больно медленно он происходит. Знаю что можно его значительно ускорить. Есть ли варианты, алгоритмы?
Поиск на форуме проблему не разъяснил.
PM   Вверх
Underdark
Дата 9.2.2005, 10:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 12.7.2004
Где: Ульяновск

Репутация: 1
Всего: 2



Цитата
Так вот, сделал я этот поиск, но уж больно медленно он происходит. Знаю что можно его значительно ускорить. Есть ли варианты, алгоритмы?


А код показать? smile
PM MAIL   Вверх
Akina
Дата 9.2.2005, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Voyager
Дата 9.2.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Вот код.
Код

Function FindBlock(Memory: TMemoryStream;block:Tblock;len:byte;pos:integer):integer;
var
 sz,i,fpos,maxpos,ppos:integer;
 blocktmp:Tblock;
 flen,max:byte;
 ch:char;
begin
 Result:=-1;
 ppos:=pos-4095;
 If ppos<0 then ppos:=0;
 max:=3;
 sz:=pos;
 While sz>ppos do
   begin
     sz:=sz-1;
         Memory.Seek(sz, soFromBeginning);
         Memory.Read(blocktmp,len);
         i:=0;
         flen:=0;
         While (i<len) and (blocktmp[i+1]=block[i+1]) do
           begin
             inc(i);
             flen:=i;
           end;
         If (flen>=max) and (flen>=3) then
           begin
             max:=flen;
             fpos:=sz;
             Result:=100*fpos+max;
             If flen=len then exit;
           end;
end;


Memory - файл висит в памяти.
block - искомая строка.
len - длина (18)
pos - позиция в файле (ищем в 4 кб до данной позиции).

Добавлено @ 12:17
Akina
Смотрел, но как применить конкретно к данному случаю придумать пока не могу. smile
PM   Вверх
Akina
Дата 9.2.2005, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: нет
Всего: 454



Voyager
Тебе надо сразу понять - поиск полного совпадения и поиск частичного совпадения надо вести разными модулями, т.е. кодить по отдельности. Потому как искать частичное совпадение усекновением подстроки и поиском полного совпадения подстроки не очень разумно...

Поиск точного совпадения полность рассмотрен по ссылке, и додумывать там нечего. Ну разве что файл большой и в память его целиком не взять (по любой причине) - тогда предусмотреть буфер чтения и искать кусками... хотя разумнее потратить эту память на составление словаря текста и искать уже в нем... поиск подстроки же сразу разумнее вести через словарь. ИМХО конечно.

Кода не дам - в Дельфах ни фига не понимаю. Разобраться могу, конечно, но не более, ибо лень.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.