Текущий архив: 2004.05.30;
Скачать: CL | DM;
ВнизЧто будет быстрее: сравнить две строки[255] или взять к.л. Найти похожие ветки
← →
Vlad Oshin © (2004-05-14 11:37) [0]функцию от них и сравнить результаты? Как думаете?
Преследуется задача вести лог.
Периодически (раз-два в секунду)получаю короткую строку, но они очень часто повторяются, сильно не желательно бы писать их все в лог. В принципе, можно ошибиться, чтоб 2 раза записать строку, но пропустить нельзя.
Может и функцию порекомендуете, если второй вариант лучше?
← →
Паниковский © (2004-05-14 11:50) [1]Vlad Oshin
Быстрее сравнить две строки.
← →
Vlad Oshin © (2004-05-14 11:53) [2]быстрее даже чем такое, как простейшее вычисление длинны?
← →
jack128 © (2004-05-14 11:55) [3]
> быстрее даже чем такое, как простейшее вычисление длинны?
а что равенство длин означает равенство строк? ;-)
← →
DVM © (2004-05-14 11:55) [4]Не я думаю, длину короткой строки вычислить быстрее.
А что ты мучаешься? Сделай пару миллионов проходов и погляди разницу.
← →
DVM © (2004-05-14 11:56) [5]
> а что равенство длин означает равенство строк? ;-)
Нет. Зато неравенство означает их различие.
← →
Паниковский © (2004-05-14 11:56) [6]Тады во
if strlen(str1) = strlen(str2) then
begin
if not Check(str1,str2) then
write(logFile,str1);
end
else
write(logFile,str1);
/*Все написано на псевдо Паскале в Дельфи не проверялось*/
← →
McSimm © (2004-05-14 11:59) [7]
> Vlad Oshin © (14.05.04 11:37)
Если функцию брать один раз, а сравнивать часто, то очень даже эффективно. Я использовал crc32, но мне не очень критична скорость была, т.к. функция вычисляется единожды, а хранится и используется долго. Ложных равенств в практике ни разу не случалось, а скорость сравнения двух int32 это уже совсем другая скорость.
← →
jack128 © (2004-05-14 12:03) [8]
> Нет. Зато неравенство означает их различие.
так в Delphi сравнение строк так и реализовано -> сначало сравнивается длина, а потом содержимое.
← →
Vlad Oshin © (2004-05-14 12:03) [9]вычисление длинны - первое и простейшее, что пришло на ум. Мне бы что-то похитрее, но простое...
Чтоб не сравнивать все-таки. Пусть будут иногда повторения строк, не страшно
> DVM © (14.05.04 11:55) [4]
> Не я думаю, длину короткой строки вычислить быстрее.
> А что ты мучаешься? Сделай пару миллионов проходов и погляди
> разницу.
Потом, конечно, так и сделаю, для контроля
← →
Anatoly Podgoretsky © (2004-05-14 12:21) [10]Так для расчета CRC нужно время и большее чем сравнение строк, которое делается в фунции простым сравнением символов, после сравнения длин.
← →
Паниковский © (2004-05-14 12:30) [11]function Check(str1,str2:string):boolean;
var
count:integer;
begin
result := true;
for count := 1 to Length(str1) do
if str1[count] <> str2[count] then
result := false;
end;
...
if strlen(str1) = strlen(str2) then
begin
if not Check(str1,str2) then
write(logFile,str1);
end
else
write(logFile,str1);
....
/*Все написано на псевдо Паскале в Дельфи не проверялось*/
← →
McSimm © (2004-05-14 12:34) [12]>Anatoly Podgoretsky © (14.05.04 12:21)
>Так для расчета CRC нужно время и большее чем сравнение строк
Но если, как я и написал, CRC считается один раз, а сравнения делаются часто, то эффект будет.
Например, если в логе миллион строк уже, и каждую входящую хочется сравнить со всеми.
← →
Digitman © (2004-05-14 12:35) [13]
> Vlad Oshin © (14.05.04 11:37)
здесь, очевидно, нужно уточнить, что чаще требуется - сравнение на равенство или НЕравенство
после возможного сравнения длин 1-е во многих случаях (при длинных строках) предпочтительней реализовывать на базе CRC32/64, второе (при коротких строках) - явным посимвольным сравнением
← →
Digitman © (2004-05-14 12:38) [14]
> Vlad Oshin
если речь идет о СУБД, не позволяющей уникально индексировать строки такой длины, то в целях автом.проверки уникальности не самым плохим выходом как раз и будет создание доп.поля, хранящего уникально индексированного CRC строки (CRC вычисляется либо в триггере либо на кл.стороне)
← →
Матлабист (2004-05-14 13:02) [15]Насколько я понял, то если сначала было:
"A", потом "B", потом снова "A", то последнее "A" можно не печатать? Вообще, какие могут быть объемы?
> Периодически (раз-два в секунду)получаю
довольно-таки долго
Возможные решения:
Хранить список введенных ранее строк в
1) B-дерево
2) Хэш (например THashStringList, Delphi 7)
3) Сортированый список TStringList (sorted) (медленней всех, но быстрее в реализации)
В принципе, времени на поиск и вставку должно хватать
← →
Матлабист (2004-05-14 13:05) [16]Точнее THashedStringList (IniFiles)
← →
Кабан (2004-05-14 14:19) [17]можно сравнивать, допустим, первые 4 байта
← →
Vlad Oshin © (2004-05-14 14:23) [18]всем спасибо!
Удалось найти автора другой программы, он поправил
а быстрее всего получилось именно тупое
if s1=s2
> McSimm © (14.05.04 12:34)
не, не то, сравнивать надо было часто
> Digitman ©
а в БД воткнуть идея!
чтоб потом лог обрабатывать легче
> Паниковский ©
не, проще сравнить получается
jack128 © (14.05.04 12:03) [8]
> Anatoly Podgoretsky © (14.05.04 12:21) [10]
вот кого надо было сразу слушать :)
и не парится
← →
Игорь Шевченко © (2004-05-14 14:52) [19]Кстати говоря, из личного опыта: Если строк, с которыми надо сравнивать, много, и они отличаются, скажем, неким символом, например, первым, то можно создать массив, размером в 256 (или 128) из списков, в каждом из которых будут строки, у которых первый символ одинаковый (тоже, своего рода, разновидность хэш-таблицы). Поиск на совпадение в таком мультисписке обычно быстрее, чем в в общем списке строк, осоебнно при большом количестве строк и более или менее равномерном распределении первого символа.
Страницы: 1 вся ветка
Текущий архив: 2004.05.30;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.047 c