Какая структура данных самая быстрая, чтобы найти наиболее подходящий префикс? - PullRequest
0 голосов
/ 19 ноября 2018

Контекст: я работаю над анализатором для строк useragent ( Yauaa ), и в рамках этого анализа я хочу сделать обоснованное предположение, о какой марке устройства следует сообщать. У меня есть реализация, которую нужно переписать, чтобы она была намного эффективнее.

Поскольку я не хочу иметь полный список всех устройств, я хочу выполнить обнаружение на основе префикса модели.

Итак, у меня есть набор данных с префиксами и брендом, с которым он связан:

  • "GT-" -> "Samsung"
  • "LLD-" -> "Huawei"

И затем я хочу сделать .get ("GT-1234124"), который должен привести к "Samsung", потому что это "самый длинный совпадающий префикс".

Я посмотрел на структуру Три, но, похоже, для противоположной ситуации. Насколько я понимаю, вы начинаете с набора значений и можете эффективно получить все значения, начинающиеся с указанного префикса.

Если бы я реализовал это с нуля, я бы использовал дерево, похожее на три, но обходил его по-другому. То, что я ищу, - это структура данных, которая делает то, что мне нужно, как можно быстрее.

Какую структуру данных вы рекомендуете для этого варианта использования?

Существует ли существующая (проверенная) реализация, которую я могу использовать?

1 Ответ

0 голосов
/ 21 ноября 2018

Я немного покопался в структурах данных и обнаружил, что, по сути, структура Три - это то, что мне нужно, с другим способом обхода структуры.

Поскольку эта структура действительно проста, я создал свою собственную реализацию, которая работает очень хорошо.

См: https://github.com/nielsbasjes/yauaa/blob/master/analyzer/src/main/java/nl/basjes/parse/useragent/utils/PrefixLookup.java


Обновления:

  1. Я написал статью об этом https://techlab.bol.com/finding-the-longest-matching-string-prefix-fast/
  2. Я поместил свою реализацию в отдельную библиотеку, которую я открыл, и которая уже доступна через maven central. Смотри https://github.com/nielsbasjes/prefixmap
...