![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как быстро сравнить две строки? [D7, XP]
Jimmy © (2012-11-05 19:36:00)Подскажите, как можно быстро сравнить две строки? (Быстрее, чем St1=St2.) Заранее спасибо!
Dennis I. Komarov (2012-11-07 18:42:00) [21]
> не нужна в этом случае контрольная сумма. нужно лишь однозначное
> правило формирования данных.
> например:
> 1) карты нумеруются сквозной нумерацией.
Фи, как не педагогично :)
2 бита на масть, 3 на вес (если не ошибаюсь там 32 листа).
+ еще 3 бита на состояние остается
DVM (2012-11-07 18:16:00) [22]
> MsGuns © (07.11.12 17:01) [42]
Ой, да ладно. Высосано из пальца все. Все перечисленные недостатки как то имена функций, типы на первый взгляд лишние - есть результат портирования оригинального кода Си на паскаль с максимальным сохранением имен. Оставлены осознанно, а не по недосмотру/незнанию.
Медвежонок имел в виду, что в WinApi есть Com обертка к некоторым функциям CryptoApi которая умеет вычислять хэши. Обертка для делфи имхо неудобная.
Очень Злой (2012-11-07 17:33:00) [23]
> if (St1[1]=St2[1])then
> if (St1=St2)then ...
> работает быстрее, чем
> if (St1=St2)then ...
> Значит второй вариант уже не самый оптимальный
а что скажет первый вариант на случай, когда St1 или St2 содержит пустую строку?
MsGuns (2012-11-07 17:01:00) [24]>Не, это просто какая-то Жопа.
>да неужели? ну ка аргументируй.
ХЗ, я так даже будучи скубентом 2-го курса не писал - сразу двубалили за такое.
Суперизбыток кода, масса тавтологий, имена переменных и функций...
Короче, не Жопа, а Ж О П А.
Я не знаю, что Медвежонок имел в виду, но я бы за стиль просто выгонял бы в дворники таких "умельцев" :)
И. Павел (2012-11-07 16:27:00) [25]> Ее небольшой минус в том, что она может иногда разным строкам
> поставить в соответствие одинаковые числа
Это не минус, а норма для хеш-функций.
Jimmy (2012-11-07 16:10:00) [26]> sniknik
Точно не считал, но даже с учетом альфа-бета отсечения десятки-сотни тысяч, если не больше. Если не верите, такой факт: лучшая программа для игры в Преферанс Макарова по крайней мере в первых версиях думала еще дольше. Так что шутки с бабиной неуместны, причем уже не в первый раз.
> DVM
Да, ошибку выдавала какая-то другая дочерняя функция.
А проблему решил так: нашел код на ассемблере в справке "DelphiWord 2006" определения хеш-суммы строки. Ее небольшой минус в том, что она может иногда разным строкам поставить в соответствие одинаковые числа, но это мелочи. Быстродействие увеличилось очень сильно, причем это позволило увеличить количество хеш таблиц что привело еще к более быстрому раздумью над ходом. И теперь я понял почему мои попытки использовать хеш таблицы в шахматах только увеличивали машинное время - проблема была та же.
Всем спасибо за помощь.
Медвежонок Пятачок (2012-11-06 13:25:00) [27]Я уже испугался и приготовился к неприятностям
Rouse_ (2012-11-06 10:21:00) [28]
> Медвежонок Пятачок © (05.11.12 20:47) [21]
> А кто здесь говорил про проблемы?
> Ты не переживай, лет 20 назад я точно так же бы юзал такие
> модули.
А сейчас АПИ юзаешь? Ну-ну...
sniknik (2012-11-06 09:36:00) [29]> Проблема в том, что сравнивая имеющиеся карты с теми, что хранят хэш-таблицы уходит много времени. Пока сравниваю строки.
сколько миллионов карт(операций) для сравнения? должно быть много, раз оптимизация в сравнении строк потребовалась...
имхо, "дело не в бобине".
AV (2012-11-06 09:21:00) [30]Мысля
Когда писали компилятор, они что, думали "А давайте напишем как нибудь потормознее что бы было, если пишут"
St1=St2
Тем более, в паскале строки - фишка паскаля. Тем более, базовая. Тем более, эти операции медленные. Наверняка, все продумали.
Если что-то выкинуть, "для оптимизации", рванет в другом месте
DVM (2012-11-05 22:11:00) [31]
> Очень Злой (05.11.12 22:05) [33]
То что код
if (St1[1]=St2[1])then
if (St1=St2)then ...
оказался быстрее при условиях автора вопроса я принял на веру, иначе чего он спрашивает вообще. Это и есть частный случай. Проверять во что компилируется выражение St1=St2 надо.
DVM (2012-11-05 22:08:00) [32]
> Или я что-то не правильно понимаю?
если строки окажутся не равны и это выяснится на последнем символе, то плюс к общему времени прохождения по строке будет добавлена еще операция сравнения первых символов. Итого первые символы будут проверены дважды.
Очень Злой (2012-11-05 22:05:00) [33]
> В частных случаях он быстрее, в общем чуть медленнее даже.
>
Почему?
Вроде как само сравнение St1=St2 должно осуществляться посимвольно начиная с первого и при несовпадении очередного символа сразу сказать что строки не равны, не пробегаясь далее по остальным символам...
и тогда код
if (St1[1]=St2[1])then
if (St1=St2)then ...
должен работать всегда не быстрее сравнения St1=St2
Или я что-то не правильно понимаю?
DVM (2012-11-05 21:49:00) [34]
> Anatoly Podgoretsky © (05.11.12 21:26) [31]
> Думаешь сравнение иначе делается?
Думаю, что где то в другом месте у него ошибка (возможно в моем коде, т.к. на D7 я не проверял), в коде TMD5.DigestCompare ошибке подобной описанной возникать негде.
Anatoly Podgoretsky (2012-11-05 21:26:00) [35]> DVM (05.11.2012 20:06:05) [5]
Думаешь сравнение иначе делается?
DVM (2012-11-05 21:25:00) [36]
> Jimmy (05.11.12 21:14) [28]
У меня нет никаких ошибок. Приводи весь код.
Anatoly Podgoretsky (2012-11-05 21:25:00) [37]> Jimmy (05.11.2012 20:00:03) [3]
В первом случае нет сравнения строк, поэтому пример бессмысленный, а если
рассматривать эти две строки как целое, то еще и мделеннее
Jimmy (2012-11-05 21:14:00) [38]Ошибка "Integer Overflow"
DVM (2012-11-05 21:11:00) [39]
> Jimmy (05.11.12 21:09) [26]
if TMD5.DigestCompare(Digest1,Digest2) then
они одинаковые
Jimmy (2012-11-05 21:09:00) [40]DVM
Digest1,Digest2:TMD5Digest;
Что следует сравнивать?
Digest1.A=Digest2.A?