Les listes sont très maladroites ici, pour ne pas dire inefficaces. Dans Clojure, il est plus idiomatique d'utiliser des vecteurs et des hash-maps et des ensembles, le cas échéant. En utilisant hachage cartes:
(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)))
Si vous le vouliez à imprimer triés vous pouvez utiliser sorted-map
s à la place, mais vous devez écrire votre propre version de assoc-in
qui ont utilisé l'ensemble des cartes triées chemin vers le bas. Dans tous les cas:
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
Donc la version de Brian serait bien je suppose que si vous avez toujours utilisé le même nombre de clés? – Johnny
Votre définition de 'prefix-matches' utilise une fonction' map-filter', mais cette fonction n'existe pas dans la bibliothèque standard. J'ai essayé d'inverser ce qu'il fait, mais ce n'est pas évident. Pouvez-vous poster sa définition? –
'map-filter' est similaire à' keep', qui se trouve dans le noyau lib. – NielsK