У меня есть набор пар префикс/значение и хочу найти любое значение в этом соединении, связанное с префиксом, с которого начинается моя текущая целевая строка. (Не важно, чтобы поведение определялось в случае, когда соответствует более одного префикса, поскольку характер моего варианта использования таков, что это никогда не должно происходить).
Ниже приведена наивная (рабочая) реализация:
(defn prefix-match [target-str pairs]
(some
(fn [[k v]]
(if (.startsWith target-str k)
v
false))
pairs))
Таким образом:
user=> (prefix-match "foobar" {"meh" :qux, "foo" :baz})
:baz
Это работает по назначению, но есть O (n) с длиной последовательности pairs
. (Быстрая вставка в pairs
также желательна, но не так важна, как быстрый поиск).
Первое, что приходит на ум, - это разбор сортированной коллекции с эффективным случайным доступом, но я не уверен, какие структуры данных в Clojure наиболее подходят для задачи. Предложения?