2014-09-26 8 views

risposta

12

le mappe di array mantengono l'ordine di inserimento ma non si deve fare affidamento su tale comportamento tranne che in casi molto semplici in cui si sa che la mappa non verrà modificata. Usa an ordered collection se hai davvero bisogno di questo comportamento.

array mappe dovrebbero essere usati per molto piccole mappe (16 keys right now) come la ricerca e "modifica" prestazioni migliori di un hash-mappa della stessa dimensione:

(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 
7

Le mappe di array e le mappe di hash hanno la stessa interfaccia, ma le mappe di array hanno una complessità di ricerca O(N) (ad esempio è implementata come una semplice serie di voci), mentre le mappe hash hanno una complessità di ricerca O(1).

Le mappe di array presentano il vantaggio (che non è necessario il più delle volte) di mantenere l'ordine di inserimento, quindi quando si esegue un'operazione che itera sulla mappa (ad esempio, map o reduce), è possibile elaborare il voci nello stesso ordine di quando le hai inserite.

Si noti che se si "modifica" (nel senso di raccolta persistente) una mappa di array ripetutamente, ad un certo punto diventerà una mappa di hash. per esempio.

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 

Fondamentalmente, preferisci sempre le mappe hash se non ti interessa l'ordine delle chiavi. Inoltre, se si utilizzano le mappe di array, tenere presente il compromesso delle prestazioni di ricerca.