Le liste sono molto maldestre qui, per non dire inefficienti. In Clojure è più idiota usare i vettori e le mappe hash e le serie quando appropriato. Utilizzando hash-mappe:
(def in-tree
'((1 2)
(1 2 3)
(1 2 4 5 9)
(1 2 4 10 15)
(1 2 4 20 25)))
(defn add-to-trie [trie x]
(assoc-in trie `([email protected] :terminal) true))
(defn in-trie? [trie x]
(get-in trie `([email protected] :terminal)))
Se si voleva per stampare ordinato si potrebbe usare sorted-map
s, invece, ma avresti dovuto scrivere la propria versione di assoc-in
che ha utilizzato le mappe allineati per tutta la strada verso il basso. In ogni caso:
user> (def trie (reduce add-to-trie {} in-tree))
#'user/trie
user> trie
{1 {2 {4 {20 {25 {:terminal true}}, 10 {15 {:terminal true}}, 5 {9 {:terminal true}}}, 3 {:terminal true}, :terminal true}}}
user> (in-trie? trie '(1 2))
true
user> (in-trie? trie '(1 2 4))
nil
user> (in-trie? trie '(1 2 4 20 25))
true
fonte
2009-09-21 08:49:26
Quindi la versione di Brian andrebbe bene suppongo che hai sempre usato lo stesso numero di chiavi? – Johnny
La definizione di 'prefix-matches' utilizza una funzione' map-filter', ma non esiste tale funzione nella libreria standard. Ho provato a decodificare ciò che fa, ma non è ovvio. Puoi postare la sua definizione? –
'map-filter' è simile a' keep', che è nel core lib. – NielsK