Эффективный поиск идентификатора с использованием подстановочных строк в качестве ключей - PullRequest
2 голосов
/ 28 марта 2019

Мне нужно эффективно сопоставить входную строку с большим набором ранее вставленных строк, все известной длины N.

Эту проблему обычно можно решить с помощью радикальных деревьев (пример вопрос здесь ), но у меня есть некоторые особые свойства, которые, по моему мнению, отличают эту проблему от того, что я видел до сих пор:

  • И входные, и сохраненные строки могут содержать символы подстановки _ (нетстрока - сохраненная или входная - может содержать только символы подстановки).Например, a_c будет соответствовать _bc, но не __b.
  • Набор изменяется, поэтому вставка / удаление записей должно быть простым.
  • Строки не являются произвольными;допустимые символы различны для каждой позиции в строке.Например, первый символ может быть только в [a-c], в то время как второй символ может быть в [a-z].Это известно заранее и никогда не меняется.
  • Мне не нужно возвращать совпадения строк.Вместо этого мне нужны идентификаторы соответствующих строк.Я упоминаю об этом в случае, если есть эффективный способ сохранить график без представления всех вставленных строк.

Мое текущее решение состоит в том, чтобы сохранить трехмерный набор векторов, где первое измерение соответствует позициисимвола в строке и другого с его значением (включая подстановочный знак);третье измерение содержит все идентификаторы, которые соответствуют этой конкретной позиции / значению.Чтобы найти набор совпадений, я вычисляю set_intersection всех идентификаторов, которые я получаю, просматривая эту матрицу с входной строкой (аналогично это предлагаемое решение ).

Однако эторешение все еще не достаточно быстрое (это мое текущее узкое место), и мне было интересно, есть ли способ сделать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...