У меня есть коллекция пар префикс / значение, и я хочу найти любое значение в этом соединении, связанное с префиксом, с которого начинается моя текущая целевая строка. (Не важно, чтобы поведение определялось в случае совпадения нескольких префиксов, поскольку характер моего варианта использования таков, что это никогда не должно происходить).
Наивная (рабочая) реализация выглядит следующим образом:
(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 наиболее подходят для этой задачи. Предложения?