En Scheme, puedo usar define-struct
para hacer un árbol de búsqueda binaria, pero ¿cómo lo haces en Clojure?¿Cómo se hace un árbol de búsqueda binario en Clojure?
Respuesta
Puede usar structmaps. Para definir una:
(defstruct bintree :left :right :key)
Haciendo ejemplo:
(struct-map bintree :left nil :right nil :key 0)
luego podrás acceder a los valores de la estructura como esta:
(:left tree)
etc.
O puede crear nuevas funciones de acceso:
(def left-branch (accessor bintree :left))
y utilizarla:
(left-branch tree)
No sé Clojure, pero apuesto a que es la misma forma en que lo haces en Scheme sin define-struct
... solo contra las ramas izquierda y derecha. Para encontrar algo, recurse hasta que golpee un átomo.
En serio, structmaps suena como lo que quieres. Encontré this page. Busque structmaps a mitad de camino.
La forma más sencilla sería utilizar el árbol que ya está definido en el lenguaje (cada-mapa Ordenado es un árbol de verdad, si sólo tiene funciones diferentes para comparar claves, use sorted-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"
¿No está ordenado? Creo que sería una mejor opción, y la clave podría ser parte de las estructuras que almacena. El mapa ordenado te obliga a separar la clave y manejarla por separado para siempre. –
+1 de todos modos, está cerca de lo que hubiera dicho, si hubiera visto la pregunta cuando se le preguntó. –
- 1. Cómo crear un árbol binario
- 2. Búsqueda recursiva de un nodo en un árbol no binario
- 3. ¿Cómo implementar un árbol binario?
- 4. Árbol binario del árbol general
- 5. Encontrar un bucle en un árbol binario
- 6. Altura del árbol binario
- 7. Atravesando un árbol binario recursivamente
- 8. Transferencia de árbol binario
- 9. Cómo convertir un árbol binario en un árbol de búsqueda binario en el lugar, es decir, no podemos usar ningún espacio adicional
- 10. ¿Cómo se hace un objeto invocable en Clojure?
- 11. ¿Se puede cruzar un árbol no binario en orden?
- 12. Implementando un árbol de búsqueda binaria equilibrado?
- 13. búsqueda binaria vs árbol de búsqueda binaria
- 14. ¿Qué es un "nodo interno" en un árbol de búsqueda binario?
- 15. Haskell: Acoplar árbol binario
- 16. Sumas equilibradas en árbol binario
- 17. Imagen de espejo de un árbol binario
- 18. Equilibrio de un árbol binario (AVL)
- 19. búsqueda XML en Clojure
- 20. Altura promedio de un árbol de búsqueda binaria
- 21. Árbol binario usando PHP + MySQL
- 22. Árbol binario GraphViz árbol izquierdo y derecho
- 23. Equilibrar un árbol de búsqueda ternario
- 24. Encontrando altura en Árbol de búsqueda binaria
- 25. menos unario y binario en Parse árbol
- 26. árbol de búsqueda Guardar estado de ejecución
- 27. imprime un árbol binario en uno de sus lados
- 28. ¿Cómo se puede leer el contenido de un archivo binario en una cadena en Clojure?
- 29. ¿In_array() usa un algoritmo de búsqueda binario?
- 30. ¿Cómo determinar si un árbol binario está completo?
¿Cómo es esto mejor que usar una lista anidada o un vector? – Zaz
Es mejor porque las claves tienen nombre y tienen acceso garantizado a tiempo constante (las listas son de acceso lineal, aunque los vectores son constantes). Aunque esto fue escrito en 2009, y mucho ha cambiado desde entonces. Solo estaba recomendando 'defstruct' porque la pregunta era sobre 'define-structure' del esquema. –