![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
ivans |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 14.1.2007 Репутация: нет Всего: нет |
Приветствую,
Мне нужно реализовать следующую задачу: имеется множество пар "шаблон - значение". Когда я получаю на вход некоторую строку, необходимо быстро найти значение, шаблон которого наиболее точно соответствует введённой строке. Допустим у меня есть следующие пары: "deck*" => 1 "de*" => 2 "*" => 3 Если я получаю на вход строку "deck123", должно быть выбрано значение 1. Если входная строка - "dekxxx", выбирается значение 2. Входная строка "pos123" выбирает значение 3. Сейчас я делаю это с помощью двух списков: первый содержит все шаблоны, начинающиеся не с метасимвола, второй - все шаблоны, первый символ которых - метасимвол (*, ? , [ и т.д.). Первый список отсортирован по первой букве шаблона а в пределах буквы - по убыванию длины префикса шаблона, не включаещего метасимволы. Второй список отсортирован по убыванию длины шаблона. Вначале я ищу первый элемент в списке 1, который начинается на ту же букву, что и введённая строка. Затем я просматриваю список последовательно до тех пор, пока первая буква остаётся неизменной и вызываю функцию сопоставления строки с шаблоном. Если сопоставление выполнено успешно, значение найдено. Если для выбранного отрезка из первого списка ни один шаблон не был успешно сопоставлен со входным значением, я последовательно просматриваю второй список от начала до конца, пока не будет найден совпадающий шаблон. Существуют ли готовые контейнеры (аналогичные STL map), которые позволяют выполнять подобного рода поиск? Это сообщение отредактировал(а) ivans - 10.12.2009, 13:21 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Смотрите в сторону 'Регулярных Выражений' (и 'Конечных Автоматов', конкретно NFA & DFA). DFA позволяет выяснить принадлежность строки к конкретному шаблону за 1 посимвольный просмотр этой строки
|
|||
|
||||
ivans |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 14.1.2007 Репутация: нет Всего: нет |
Как раз способ сопоставления строки с отдельным шаблоном меня не сильно волнует. Я скорее всего буду использовать обычный glob из libc, даже не regexp. Вопрос именно в наличии ассоциативного контейнера, который бы позволял находить элемент по наиболее точному соответствию ключа (который представляет собой шаблон) со входной строкой. |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
КА - это способ произвести сопоставление со ВСЕМИ шаблонами за 1 проход по исходной строке. Вот где такое взять готовое - не знаю (в свое время делал сам) Присоединённый файл ( Кол-во скачиваний: 10 ) ![]() |
|||
|
||||
ivans |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 14.1.2007 Репутация: нет Всего: нет |
Спасибо за пример! Попробую теперь понять, что там к чему... |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |