Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро сравнить две строки? [D7, XP]


Страницы:   1 2 3 4

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?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо