私は接頭辞と値のペアのコレクションを持っていて、この接続で現在のターゲット文字列が始まる接頭辞に関連する値を探します。 (複数の接頭辞が一致する場合、動作の定義は重要ではありません。なぜなら、これは決して発生しないようにするためです)。clojure:文字列がコレクション内の任意の接頭辞で始まるかどうかを効率的に判断する
ナイーブ(作業)の実装は、以下:
(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
これは、意図したとおりに動作するが、pairs
配列の長さはO(n)です。 (pairs
への高速挿入も望ましいが、高速検索ほど重要ではない)。
最初に気になるのは、効率的なランダムアクセスでソートされたコレクションを二等分することですが、Clojureのどのデータ構造がタスクに最も適しているかわかりません。提案?
あなたのサンプルコードは広告として動作しません。接頭辞、target-str、またはマップキーはどれですか? –
@JustinKramerマップキーは接頭辞です。例の呼び出しが正しくありませんでした。一定。 (プレフィックスマッチ関数は、実際に本番コードで使用しているものです)。 –