Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как ускорить работу программы? [D6, Win95/98]


Маша ©   (2002-10-21 10:52:00) 

Уважаемые программисты!
Написала я маленькую программку. Задача ставится простая - используя стандартную функцию Indexof сравнить строки в разных файлах. Но если файлы порядка 12Мб каждый, то процесс затягивается на 20 минут.
Как можно ускорить процесс поиска?
Зараннее спасибо!


song   (2002-10-21 13:22:00) [1]

:-)


cult   (2002-10-21 13:17:00) [2]

REA © :))))


REA   (2002-10-21 13:16:00) [3]

А вы туберкулезом не болели?


ЮЮ   (2002-10-21 13:13:00) [4]

А какие различия ищутся в таких больших файлах?


Маша   (2002-10-21 13:06:00) [5]

Уважаемый Smithson!
Большущее СПАСИБО!
Только поняла не всё , пойду разбираться.


Кот Бегемот   (2002-10-21 11:50:00) [6]

Машенька, а Вы ракеты запускаете ???
Если задача "используя стандартную функцию Indexof"
то какая разница - 20 минут - не 20 минут
Задача же решена - значит все Ok


Smithson   (2002-10-21 11:47:00) [7]

Читать файлы по прежнему в TStringList, но сравнивать их не IndexOf..., а своими способами. Например:

[code]Function substr(Pattern, S: String; Num: Integer = 1; UpperChars: Boolean = false): Integer;
var Lambda: array[char] of integer;
PatternLen: Integer;
fIndex, q, I, J, N: Integer;
arFound: Array of Integer;
Begin
{ Расчитать переходы при заданых стоп-символах }
fillchar(Lambda, SizeOF(lambda), 0);
PatternLen := length(Pattern);
if UpperChars then begin
S := AnsiUpperCase(S);
Pattern := AnsiUpperCase(Pattern);
end;
for I := 1 to PatternLen do lambda[Pattern[I]] := I;

N := length(S);
fIndex := 0;
if Num <> 1 then begin
SetLength(arFound, N);
fillchar(arFound[0], SizeOF(arFound), 0);
end;
q := 0;
while q <= N-PatternLen do begin
J := PatternLen;
while (j > 0) and (Pattern[J] = S[q+J]) do Dec(J);
if J = 0 then begin // Совпадение
if Num = 1 then begin // Нужно только первое совпадение
Result := Q+1;
exit
end;
arFound[fIndex] := Q+1; Inc(fIndex);
Q := Q+(PatternLen+1-Lambda[S[Q+PatternLen+1]]); // Смещение на новую позицию
end
else begin // Облом
if j - Lambda[S[Q+J]] <= 0 then Inc(Q)
else Q := Q+J-Lambda[S[Q+J]];
end;
end;

if Num = 0 then begin // нужен весь массив вхождений
SetLength(arSubStrFound, fIndex-1);
for I := 0 to fIndex-1 do arSubStrFound[i] := arFound[i];
Result := fIndex;
exit
end;
if Num < 0 then begin // надо найти n-ое вхождение с конца
J := fIndex+Num;
if J < 0 then Result := 0 // Не такого
else Result := arFound[J];
end
else begin// надо n-ое вхождение с начала
if Num-1 > fIndex-1 then Result := 0 // Нет такого вхождения
else Result := arFound[Num-1];
end;

arFound := nil;
End;

[/code]

Для больших строк и редких совпадений дает очень ошутимый выигрышь в скорости. А вообще ищи "алгоритмы стравнения строк"


Маша   (2002-10-21 11:15:00) [8]

Smithson
А какие есть еще алгоритмы сравнения ? Я могу отказаться и от Indexof, нужно только чтобы большие файлы быстро сравнивались.


Anatoly Podgoretsky   (2002-10-21 10:58:00) [9]

Немного ускорить можно, если загнать файлв в память и отсортировать, но допустимо ли это по условию задачи


Smithson   (2002-10-21 10:58:00) [10]

Можно пытаться изменить алгоритм сравнения, найти более быстрый, чем стандартный Pos... Но тогда придется отказать от indexOf


Song   (2002-10-21 10:56:00) [11]

В каком компоненте или классе?


Наверх

Титульная страница Поиск, карта сайта Написать письмо