![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение строк.
Riply © (2007-03-05 21:59:00)Здравствуйте !
Вопрос такой:
Есть строковая константа с которой (так много раз, аж страшно),
надо сравнивать другие строчки (not case-sensitive) и получать
результат <, = или >
Какой вариант лучше использовать ?
const
BaseStr = 'bla-bla';
if LowerCase(TestedString) < BaseStr then
......
const
BaseStr = 'BLA-BLA';
if UpperCase(TestedString) < BaseStr then
......
if CompareText(TestedString, BaseStr) < 0 then
...
P.S. Хотела найти подсказку в исходниках, но там ассемблер,
а мы с ним еще не подружились :(
Jeer (2007-03-07 14:09:00) [1]
> ак что берегитесь ! Скоро всех плагиаторов прищучим :)
А мы изобретаем параллельно с вами "иносказатель" математических текстов и "исказитель" математических же формул.
Так шта..
Leonid Troyanovsky (2007-03-07 13:50:00) [2]
> Riply © (07.03.07 13:10) [41]
> Зато очень нужный :)
Это хорошо, что нужный.
Расскажешь, что получилось.
> Так что берегитесь ! Скоро всех плагиаторов прищучим :)
Теперь будем осторожней.
Грешим-то, в основном, заимствованием и самоцитированием ;)
--
Regards, LVT.
Riply (2007-03-07 13:10:00) [3]>Leonid Troyanovsky © (07.03.07 10:50) [40]
>Чего-то он у тебя уж очень маленький
Зато очень нужный :)
Так что берегитесь ! Скоро всех плагиаторов прищучим :)
Leonid Troyanovsky (2007-03-07 10:50:00) [4]
> Riply © (07.03.07 07:35) [39]
> а у меня маленький алгоритм из маленькой подпрограммы, маленького
> блока основной задачи :)
Чего-то он у тебя уж очень маленький, судя по 10-30/60 элементам :)
> я имела ввиду, что "x >= y" врядли встретиться в "Войне
В математической статье, кроме формул, словарь не намного
больше, чем у Эллочки-людоедки.
--
Regards, LVT.
Riply (2007-03-07 07:35:00) [5]>И, вообще-то, неплохо б было огласить всю задачу (или цель),
>может кто еще чего вспомнит.
Вся задача слишком глобальна - "анализ статьи(материала)(в определенной области) на предмет плагиата",
а у меня маленький алгоритм из маленькой подпрограммы, маленького блока основной задачи :)
>Ну, а что будет в случае формул поступать во входном потоке
>описание в кнутовском TeX или еще что?
Сейчас, вроде, все основные журналы с удовольствием принимают и в "pdf" формате :)
"вместе с формулами" - в моем случае надо понимать не так широко,
я имела ввиду, что "x >= y" врядли встретиться в "Войне и мире" или Гамлете :)
Leonid Troyanovsky (2007-03-06 13:53:00) [6]
> Riply © (06.03.07 13:02) [36]
> вида" (вместе с формулами)
Ну, а что будет в случае формул поступать во входном потоке
описание в кнутовском TeX или еще что?
--
Regards, LVT.
Leonid Troyanovsky (2007-03-06 13:40:00) [7]
> Riply © (06.03.07 13:02) [36]
> А оправданы ли временные затраты на "вычисляешь хеши"
> или "и привести строки к тому же регистру" ?
Ну, в, любом случае, сравнение-то не одно - мы ж должны
сравнить поступившее с каждой из констант.
> Заранее задан массив строк (10 - 30 элементов, по 2 - 32
> символов).
> Требуется определить только
> заканчивается ли тестируемая строка на одну из строчек массива
> (регистро-независимо).
А, я так и подозревал, что там нет односимвольных цепочек :)
И, значит, все-таки, вхождения тоже нет - только окончание.
В любом случае, то, что я говорил в прошлом сообщении
значения не потеряло.
Кстати, с массивом констант нужно провести дополнительную
работу, например, исключить из массива те элементы,
которые не проходят ту же проверку, т.е. если первый элемент
"нт", то из массива надо убрать "ент" и т.п.
Кста, словарь Зализняка (sic!) построен, как раз, так,
т.е. буквы слова следуют в обратнов порядке -'екдяроп'.
И, вообще-то, неплохо б было огласить всю задачу (или цель),
может кто еще чего вспомнит.
--
Regards, LVT.
Riply (2007-03-06 13:02:00) [8]>[29] Sha © (06.03.07 09:22)
>И просто бежишь по массиву строк для проверки от последнего элемента к первому, вычисляешь хеши и ищешь их в таблице.
>[32] Leonid Troyanovsky © (06.03.07 10:28)
>Возможен, чтобы требуемое упорядочение придется получать
>по некому представительному образцу анализируемого текста.
>Подобную цепочку надо распарсить примерно так же: длина;строка
>и привести строки к тому же регистру.
А оправданы ли временные затраты на "вычисляешь хеши"
или "и привести строки к тому же регистру" ?
Ведь текст мы протестировали и выбросили. Второй раз искать в нем
что-то другое мы уже не будем.
Наверное, я чего-то не понимаю, или плохо ставлю задачу :(
Попробую еще раз, заодно упростив(?) условия:
Тестируемые строки будем считать полученными так SetLength(TestString, Random(1024))
и заполненные Random - значениями, взятыми из объединения
"Войны и мира", "Оценки остаточного члена в предельных теоремах для сумм
независимых случайных величин с распределением специального вида" (вместе с формулами) и Гамлета в оригинале :)
Заранее задан массив строк (10 - 30 элементов, по 2 - 32 символов).
Требуется определить только
заканчивается ли тестируемая строка на одну из строчек массива (регистро-независимо).
(совпадают = заканчивается)
P.S. Вот уж не думала, что с таким, внешне простым вопросом, придется так разбираться :)
Sha (2007-03-06 11:41:00) [9]Там в примере опечатка - строка односимвоьная должна быть '1'
Sha (2007-03-06 11:37:00) [10]> Leonid Troyanovsky © (06.03.07 10:35) [33]
>> для AnsiString можно хешировать word длины, и первый и последний word строки
> А чего даст хеширование, если среди образцов есть односимвольные?
Например, для строки ' 1' мы хешируем word'ы:
$0001 - word длины, смещение -4 от начала строки
$0031 - первый word, смещение 0 от начала строки (возможно с залезанием в терминатор)
$3100 - последний word, смещение -2 от терминатора строки (возможно с залезанием в старший байт длины)
Результат зависит от использованной функции
--
Regards, Aleksandr )
Leonid Troyanovsky (2007-03-06 10:35:00) [11]
> Sha © (06.03.07 09:48) [31]
> для AnsiString можно хешировать word длины, и первый и последний
А чего даст хеширование, если среди образцов есть односимвольные?
--
Regards, LVT.
Leonid Troyanovsky (2007-03-06 10:28:00) [12]
> Riply © (06.03.07 00:03) [24]
> Заранее задан массив строк (10 - 60 элементов, по 1 - 255
> символов)
Пусть это будет массив записей длина; строка.
Приведем строки, скажем, к нижнему регистру.
> В нашей власти, перед работой, его сортировать по любому
> признаку,
Признак этот должен быть примерно таким: ожидаемая частота
появления во входном тексте данной цепочки.
Т.е., сначала будут идти односимвольные цепочки, двух и т.д.
Ну, а цепочки одинаковой длины упорядочены по частоте.
Возможен, чтобы требуемое упорядочение придется получать
по некому представительному образцу анализируемого текста.
Возможно, что для двух задач - окончание на цепочку и
вхождение цепочки потребуют разного упорядочения.
> Поступающие строки для проверки: 0 - 1023 символа.
> Никаких ограничений на их формат нет (например, могут содержать #0 в
Подобную цепочку надо распарсить примерно так же: длина;строка
и привести строки к тому же регистру.
Производить проверки будем начиная с самых частых цепочек,
(напрмер, это будут самые короткие).
Ну и рабочей лошадкой для первой задачи (окончание) я б выбрал
AnsiStrLComp.
Для второй (вхождение) AnsiStrPos, хотя, можно еще подумать.
Да, при всех операциях мы не должны использовать StrLen и т.п.
а лишь арифметические операции с PChar.
--
Regards, LVT.
PS А чего это за задача? Работа со словарем Зализника?
Sha (2007-03-06 09:48:00) [13]* начиная с байта длины - для ShortString
для AnsiString можно хешировать word длины, и первый и последний word строки
Sha (2007-03-06 09:42:00) [14]Если это будет медленно, можно попробовать использзовать для сравнения информацию о длине строк и двухуровневое хеширование.
Первая функция, например, может хешировать 2 первых (начиная с младшего байта длины) и 2 последних символа строки и предназначена для быстрого отсева ненужных строк.
Sha (2007-03-06 09:22:00) [15]Тогда, похоже, оптимальным будет представление его любом виде,
позаоляющем определить длину элемента:
буфер ShortString'ов,
массив ANSI-строк,
StringList.
Для массива шаблонов заранее вычисляешь хеш-значения при помощи Case-нечувствительной функции.
И просто бежишь по массиву строк для проверки от последнего элемента к первому, вычисляешь хеши и ищешь их в таблице.
Riply (2007-03-06 01:32:00) [16]> [27] Sha © (06.03.07 00:23)
>равны ли 'Ф' и ф'' ?
Равны.
>Поступающие для проверки строки - это буфер с PChar'ами ?
Мы сами можем выбирать в каком виде их нам поставлять
Sha (2007-03-06 00:23:00) [17]> кирилица допустима
равны ли 'Ф' и ф'' ?
Sha (2007-03-06 00:19:00) [18]> Riply © (06.03.07 00:03) [24]
Так это ж совсем другое дело )
Поступающие для проверки строки - это буфер с PChar'ами ?
> Riply © (06.03.07 00:06) [25]
http://www.fastcodeproject.org/
http://fastcode.sourceforge.net/
Riply (2007-03-06 00:06:00) [19]>[21] Johnmen © (05.03.07 23:28)
>А я тут FastCode вспомнил
А кто такой "FastCode" и где его дают ? :)
Riply (2007-03-06 00:03:00) [20]> [20] Sha © (05.03.07 23:15)
>Хорошо бы добавить в описание немного специфики из области использования,
>тогда можно будет дать определенный ответ.
>В общем, может есть какие-то особенности задачи,
>на которых можно сыграть
Заранее задан массив строк (10 - 60 элементов, по 1 - 255 символов)
В нашей власти, перед работой, его сортировать по любому признаку,
делать Upper/LowerCase, перебросить в TStringList или еще куда :)
можем выбирать они - ShortString или string, кирилица допустима, East Asian не поддерживаем.
Cравнение not case-sensitive.
Поступающие строки для проверки: 0 - 1023 символа.
Никаких ограничений на их формат нет (например, могут содержать #0 в любом месте).
Требуется определить
заканчивается ли тестируемая строка на одну из строчек массива,
('xxxx#0xxxyyyyyyyф' заканчивается на 'yyyф')
если нет, то определить содержит ли она хотябы одну из них