Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];

Вниз

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

 
Маша   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.009 c
1-101345
Orions
2002-10-20 23:36
2002.10.31
Работа с каталогами


1-101196
МВВ
2002-10-21 14:20
2002.10.31
Hint из DLL


6-101403
MVova
2002-08-29 11:10
2002.10.31
Поиск своих серверов в сети.


1-101230
ligor
2002-10-21 21:12
2002.10.31
вывести окно


1-101367
DN
2002-10-21 11:24
2002.10.31
Работа со StringList





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский