2014-09-26 6 views

Antwort

12

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,

7

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.

Verwandte Themen