In Scheme, posso usare define-struct
per creare un albero di ricerca binario, ma come si fa in Clojure?Come si crea un albero di ricerca binario in Clojure?
risposta
È possibile utilizzare structmaps. Per definire uno:
(defstruct bintree :left :right :key)
Per effettuare un'istanza:
(struct-map bintree :left nil :right nil :key 0)
È quindi possibile accedere ai valori nella struct come questo:
(:left tree)
ecc
Oppure si può creare nuove funzioni di accesso:
(def left-branch (accessor bintree :left))
e usarlo:
(left-branch tree)
Non conosco Clojure, ma scommetto che è lo stesso modo in cui lo si fa in Scheme senza define-struct
... basta tenere insieme i rami sinistro e destro. Per trovare qualcosa, recita finché non colpisci un atomo.
Seriamente, però, le structmap suonano come quello che vuoi. Ho trovato this page. Cerca structmaps a metà strada.
Il modo più semplice sarebbe quella di utilizzare l'albero che è già definito nel linguaggio (ogni ordinato-map è un albero davvero, se avete solo bisogno funzione diversa per confrontare le chiavi, usa la mappa ordinata).
;;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 ordinato-impostato? Penso che sarebbe una misura migliore, e la chiave potrebbe essere parte delle strutture che memorizzi. mappa ordinata ti costringe a separare la chiave e gestirla separatamente per sempre. –
+1 in ogni caso, è vicino a quello che avrei detto, se avessi visto la domanda indietro quando è stato chiesto. –
- 1. Albero di ricerca binario su albero AVL
- 2. Albero binario Ricerca in ampiezza
- 3. Albero di ricerca binario per intenzioni specifiche
- 4. Implementazione di un iteratore su un albero di ricerca binario
- 5. C'è un albero di ricerca binario integrato in .NET 4.0?
- 6. altezza media di un albero binario di ricerca
- 7. Come convertire un albero binario in un albero di ricerca binario sul posto, cioè non possiamo usare alcuno spazio aggiuntivo
- 8. Un albero binario contiene un altro albero?
- 9. Come si crea un Clojure Lint?
- 10. Creazione albero somma di albero binario Scala
- 11. Trova un loop in un albero binario
- 12. Trova percorsi in un albero di ricerca binario sommando a un valore di destinazione
- 13. stampa confine albero binario
- 14. Come si crea dinamicamente un blocco di ricerca in sunspot?
- 15. eliminazione ricorsiva su un albero binario
- 16. Come implementare un albero non binario
- 17. Come implementare la ricerca in profondità (DFS) su un albero binario in java?
- 18. Come eliminare elementi in un albero binario in C?
- 19. albero binario implementazione in Ruby
- 20. Albero binario dall'albero generale
- 21. Differenza tra albero binario completo e albero binario bilanciato
- 22. Trasferimento ad albero binario
- 23. Costruire un albero binario bilanciato con foldr
- 24. stampa un albero binario su un lato
- 25. albero binario metodi statici in Java
- 26. Albero binario di espressioni matematiche
- 27. C# - Albero binario semplice
- 28. Strategia per trovare le voci duplicate in un albero di ricerca binario
- 29. In ordine iteratore per albero binario
- 30. Come si crea un diagramma di guadagno in R per un modello di albero decisionale?
Come è meglio utilizzare un elenco o un vettore annidato? – Zaz
È meglio perché le chiavi hanno un nome e hanno un accesso a tempo costante (gli elenchi sono ad accesso lineare, sebbene i vettori siano costanti). Anche se questo è stato scritto nel 2009, e molto è cambiato da allora. Stavo solo raccomandando 'defstruct' perché la domanda riguardava la' define-structure 'dello schema. –