![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как ускорить работу программы? [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]В каком компоненте или классе?