Mam kolekcję par przedrostków/wartości i chciałbym znaleźć dowolną wartość w tym połączeniu powiązaną z prefiksem, od którego zaczyna się mój bieżący ciąg docelowy. (Nie jest ważne, aby zachowanie było zdefiniowane w przypadku, gdy pasuje więcej niż jeden prefiks, ponieważ natura mojego użycia jest taka, że nigdy nie powinno to nastąpić).clojure: Skuteczne określanie, czy ciąg znaków zaczyna się od dowolnego prefiksu w zbiorze
naiwny (pracy) realizacja się następująco:
(defn prefix-match [target-str pairs]
(some
(fn [[k v]]
(if (.startsWith target-str k)
v
false))
pairs))
takie, że:
user=> (prefix-match "foobar" {"meh" :qux, "foo" :baz})
:baz
to działa zgodnie z założeniami, to jednak O (n), przy długości sekwencji pairs
. (Szybkie wstawianie do pairs
jest również pożądane, ale nie tak ważne jak szybkie wyszukiwanie).
Pierwszą rzeczą, która przychodzi na myśl, jest podzielenie posortowanej kolekcji na wydajny, losowy dostęp, ale nie jestem pewien, które struktury danych w Clojure są najbardziej odpowiednie do zadania. Propozycje?
Twój przykładowy kod nie działa zgodnie z reklamą. Jaki jest przedrostek, cel-str lub klucz mapy? –
@JustinKramer Oops. Klawisz mapy jest prefiksem; przykładowe połączenie było nieprawidłowe. Naprawiony. (Podana funkcja dopasowywania prefiksu jest tym, czego faktycznie używam w kodzie produkcyjnym). –