Ho una collezione di coppie prefisso/valore e desidero trovare qualsiasi valore in questa connessione associato a un prefisso con cui inizia la mia attuale stringa di destinazione. (Non è importante che il comportamento sia definito nel caso in cui più di un prefisso corrisponda, poiché la natura del mio caso d'uso è tale che questo non dovrebbe mai verificarsi).clojure: determinazione efficiente se una stringa inizia con qualsiasi prefisso in una raccolta
A naive (di lavoro) attuazione segue:
(defn prefix-match [target-str pairs]
(some
(fn [[k v]]
(if (.startsWith target-str k)
v
false))
pairs))
Tale che:
user=> (prefix-match "foobar" {"meh" :qux, "foo" :baz})
:baz
Questo funziona come previsto, ma è O (n) con la lunghezza della sequenza pairs
. (Anche l'inserimento rapido in pairs
è auspicabile, ma non così importante come la ricerca rapida).
La prima cosa che viene in mente è bisecare una raccolta ordinata con un accesso casuale efficiente, ma non sono sicuro quali strutture dati in Clojure siano più adatte all'attività. Suggerimenti?
Il codice di esempio non funziona come pubblicizzato. Qual è il prefisso, target-str o la chiave della mappa? –
@JustinKramer Spiacenti. La chiave della mappa è il prefisso; la chiamata di esempio era errata. Fisso. (La funzione prefisso-partita data è ciò che sto effettivamente usando nel codice di produzione). –