Dans Scheme, je peux utiliser define-struct
pour faire un arbre de recherche binaire, mais comment le faites-vous dans Clojure?Comment créer un arbre de recherche binaire dans Clojure?
Répondre
Vous pouvez utiliser des structmaps. Pour définir un:
(defstruct bintree :left :right :key)
Pour faire une instance:
(struct-map bintree :left nil :right nil :key 0)
Vous pouvez alors accéder aux valeurs de la struct comme ceci:
(:left tree)
etc.
Ou vous peut créer de nouvelles fonctions d'accesseur:
(def left-branch (accessor bintree :left))
et de l'utiliser:
(left-branch tree)
Je ne connais pas Clojure, mais je parie que c'est comme ça que vous le faites dans Scheme sans define-struct
... juste contre les branches gauche et droite. Pour trouver quelque chose, recurse jusqu'à ce que vous frappiez un atome.
Sérieusement, cependant, structmaps ressemble à ce que vous voulez. J'ai trouvé this page. Recherchez les structmaps à mi-chemin.
La façon la plus simple serait d'utiliser l'arbre qui est déjà défini dans la langue (chaque-carte triée est un arbre vraiment, si vous avez juste besoin d'une fonction différente pour comparer les clés, utilisez trié-map-by).
;;define function for comparing keys
(defn compare-key-fn [key1 key2] (< key1 key2))
;;define tree and add elements
(def my-tree
(-> ;;syntax sugar
(sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys
(assoc 100 "data for key = 100") ;;below we add elements to tree
(assoc 2 "data for key = 2")
(assoc 10 "data for key = 10")
(assoc -2 "data for key = -1")))
;;accesing elements by key
(prn "element for key 100 =" (my-tree 100))
;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased.
(def my-new-tree
(dissoc my-tree 2))
(prn my-new-tree) ;; to verify, that element 2 is "erased"
Non trié? Je pense que ce serait un meilleur ajustement, et la clé pourrait faire partie des structures que vous stockez. trié-carte vous oblige à séparer la clé et le gérer séparément pour toujours. –
+1 de toute façon, c'est proche de ce que j'aurais dit, si j'avais vu la question quand elle a été posée. –
- 1. Comment créer un arbre binaire
- 2. recherche d'un arbre binaire
- 3. Droite Threading un arbre binaire
- 4. C++ Insérer un arbre de recherche binaire via la récursivité
- 5. Arbre binaire récursif Java
- 6. Comment puis-je obtenir les feuilles dans un arbre de recherche binaire?
- 7. Est-ce un arbre binaire complet?
- 8. Comment créer un tableau binaire dans VbScript?
- 9. Arbres de recherche binaire
- 10. Que construiriez-vous en utilisant un arbre de recherche multiway.
- 11. Recherche d'un bloc binaire dans un fichier
- 12. Arbre de recherche d'expressions régulières (glob)
- 13. comment créer l'application binaire de l'iphone
- 14. Comment effacer un arbre dans ExtJs?
- 15. Implémenter la recherche binaire dans les objets
- 16. Aide nécessaire Création d'un arbre binaire Table de vérité donnée
- 17. Comment imprimer les données dans un arbre binaire, niveau par niveau, en commençant par le haut?
- 18. Comment créer LINQ Arbre d'expression pour sélectionner un type anonyme
- 19. Recherche d'une séquence d'octets dans un fichier binaire avec Java
- 20. Qu'est-ce qu'une arborescence Splay, un arbre rouge-noir, un arbre AVL, un arbre B et un arbre-T?
- 21. javascript implémentation de l'arbre de recherche binaire
- 22. Clojure: Comment générer un 'trie'?
- 23. Comment puis-je créer un fichier binaire en Perl?
- 24. Connexion de frères et sœurs dans l'arborescence de recherche binaire
- 25. écrire un serveur de multiplexage dans clojure?
- 26. Comment utiliser Zip dans Clojure?
- 27. Ruby on Rails, ActiveRecord, Recherche binaire
- 28. Comment créer un moteur de recherche avec des filtres?
- 29. Comment écrire: else dans condp dans Clojure?
- 30. Problème de compilation dans Clojure
En quoi cela est-il préférable à l'utilisation d'une liste ou d'un vecteur imbriqués? – Zaz
C'est mieux parce que les clés sont nommées et qu'elles ont un accès garanti en temps constant (les listes sont linéaires, bien que les vecteurs soient constants). Bien que cela ait été écrit en 2009, beaucoup de choses ont changé depuis. Je ne faisais que recommander 'defstruct' car la question portait sur' define-structure' de scheme. –