Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.31;
Скачать: CL | DM;

Вниз

Как ускорить работу программы?   Найти похожие ветки 

 
Маша   (2002-10-21 10:52) [0]

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


 
Song ©   (2002-10-21 10:56) [1]

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


 
Anatoly Podgoretsky ©   (2002-10-21 10:58) [2]

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


 
Smithson ©   (2002-10-21 10:58) [3]

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


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

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


 
Smithson ©   (2002-10-21 11:47) [5]

Читать файлы по прежнему в 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:50) [6]

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


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

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


 
ЮЮ ©   (2002-10-21 13:13) [8]

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


 
REA ©   (2002-10-21 13:16) [9]

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


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

REA © :))))


 
song ©   (2002-10-21 13:22) [11]

:-)



Страницы: 1 вся ветка

Текущий архив: 2002.10.31;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
1-101185
Valeris
2002-10-21 12:51
2002.10.31
Можно как то скрыть на форме синий Title?


4-101590
PaNiC
2002-09-19 18:40
2002.10.31
Помогите!!! Отдебагить дочерний процесс!!! ;-)


7-101546
JAndrey
2002-08-21 11:34
2002.10.31
Как запрограммировать COM порт на скорость > 115200 бит/сек


8-101391
Юра
2002-07-04 00:02
2002.10.31
SoundCard


3-101173
Mick
2002-10-11 13:41
2002.10.31
Не работает триггер Befor Insert в IB6+Infopower3000