Clojure hat eine Array-Map und Hash-Map, ich konnte den Unterschied zwischen den beiden nicht herausfinden. Könnte jemand erklären, wenn möglich mit einem Beispiel, wann einer von beiden verwendet werden würde?Was ist der Unterschied zwischen der Hash-Map und Array-Map in Clojure?
Antwort
array-maps behalten die Reihenfolge, aber Sie sollten sich nicht auf dieses Verhalten verlassen, außer in sehr einfachen Fällen, in denen Sie wissen, dass die Map nicht geändert wird. Verwenden Sie an ordered collection, wenn Sie dieses Verhalten wirklich benötigen.
(def arraymap (array-map :f 1 :g 2 :h 4 :y 5 :w 4))
(def hashmap (hash-map :f 1 :g 2 :h 4 :y 5 :w 4))
(defn add-2-keys [m]
(assoc m :new 2 :w 4))
(defn access-all-keys [m]
(mapv m [:f :g :h :y :w :not-there]))
(use 'criterium.core)
; Modification
(bench (add-2-keys array map))
Execution time mean : 125.640082 ns
(bench (add-2-keys hashmap))
Execution time mean : 150.918197 ns
; Access
(bench (access-all-keys arraymap))
Execution time mean : 260.547035 ns
(bench (access-all-keys hashmap))
Execution time mean : 305.350156 ns
:
Array-Karten sollten für sehr kleine Karten (16 keys right now) als Nachschlag und „Änderung“ Leistung ist besser als eine Hash-Karte von der gleichen Größe verwendet werden,
Array-Maps und Hash-Maps haben die gleiche Schnittstelle, aber Array-Maps haben O(N)
Lookup-Komplexität (d. H. Es ist als einfaches Array von Einträgen implementiert), während Hash-Maps O(1)
Lookup-Komplexität haben.
Array-Maps haben den Vorteil (den Sie nicht die meiste Zeit benötigen), dass sie die Reihenfolge beibehalten. Wenn Sie also eine Operation ausführen, die über die Map iteriert (z. B. map
oder reduce
), können Sie die Einträge in derselben Reihenfolge wie beim Einfügen.
Beachten Sie, dass, wenn Sie eine Array-Map wiederholt (im Sinne der persistenten Sammlung) "modifizieren", irgendwann wird es eine Hash-Map werden. z.B.
user=> (type (apply assoc (array-map) (zipmap (range 10) (range 10))))
clojure.lang.PersistentArrayMap
user=> (type (apply assoc (array-map) (zipmap (range 100) (range 100))))
clojure.lang.PersistentHashMap
Grundsätzlich immer Hash-Karten bevorzugen, wenn Sie nicht auf Schlüssel Reihenfolge kümmern. Berücksichtigen Sie bei der Verwendung von Array-Maps auch das Abwägen der Lookup-Leistung.
- 1. Was ist der Unterschied zwischen '() und (Liste) in Clojure?
- 2. Was ist der Unterschied zwischen def und defonce in Clojure?
- 3. Was ist der Unterschied zwischen: while und: when in clojure?
- 4. Was ist der Unterschied zwischen einer HashMap und einer TreeMap?
- 5. Was ist der Unterschied zwischen HashMap und HashMultimap
- 6. Clojure: Was ist der Unterschied zwischen [D und [Ljava.lang.Double ;?
- 7. Was ist der Unterschied zwischen Clojure REPL und Scala REPL?
- 8. Was ist der Unterschied zwischen `==` und `ist`?
- 9. Was ist der Unterschied zwischen `# ^` Typhinweis und `^` Typhinweis?
- 10. Was ist der Unterschied zwischen/* ... */und/** ... */
- 11. Was ist der Unterschied zwischen + = und = +?
- 12. Was ist der Unterschied zwischen $ (()) und Ausdruck?
- 13. Was ist der Unterschied zwischen:.! und: r !?
- 14. Was ist der Unterschied zwischen Verilog! und ~?
- 15. Was ist der Unterschied zwischen:
- 16. Was ist der Unterschied zwischen Difftime und '-'?
- 17. Was ist der Unterschied zwischen $ und $$?
- 18. was ist der Unterschied zwischen [[], []] und [[]] * 2
- 19. Was ist der Unterschied zwischen `&` und `ref`?
- 20. Was ist der Unterschied zwischen $ (...) und `...`
- 21. Was ist der Unterschied zwischen .Equals und ==
- 22. Was ist der Unterschied zwischen "$^N" und "$ +"?
- 23. Was ist der Unterschied zwischen? und ? = Nil
- 24. Was ist der Unterschied zwischen wahr? und boolean
- 25. Was ist der Unterschied zwischen add und [] in der Wörterbuchoperation
- 26. Was ist der Unterschied zwischen Hash-Karte und Karte
- 27. Was ist der Unterschied zwischen der JSP und der JSTL?
- 28. Was ist der Unterschied zwischen diesen beiden Objektinitialisierung in Java?
- 29. Was ist der Unterschied zwischen einem Atom in Common Lisp und einem Atom in Clojure?
- 30. Was ist der Unterschied zwischen: und :: und ::: in Javascript Grammatik