Главная страница
    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.012 c
1-101200
Volly
2002-10-20 21:16
2002.10.31
Проблема установки Rx Lib 2.7


4-101581
kerrik
2002-09-19 21:59
2002.10.31
Аналог ф-ии inherited; в С++Builder (5.0)


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


1-101181
Граф
2002-10-18 14:07
2002.10.31
progress bar в таблице


14-101525
Svin
2002-10-13 02:17
2002.10.31
DelphiX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский