2014-09-26 3 views

답변

12

배열 맵은 게재 신청서를 보관하지만지도가 수정되지 않는다는 것을 알고있는 매우 간단한 경우를 제외하고는 해당 행동에 의존해서는 안됩니다. 이 동작이 실제로 필요한 경우 an ordered collection을 사용하십시오.

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

배열지도는 아주 작은지도 조회로 (16 keys right now)와 "수정"성능은 같은 크기의 해시 맵보다 더 사용해야합니다

7

어레이 맵과 해시 맵은 동일한 인터페이스를 갖지만 배열 맵은 O(N) 조회 복잡도 (즉 간단한 항목 배열로 구현 됨)를 가지지 만 해시 맵은 O(1) 조회 복잡도를 갖습니다.

배열 순서는 계속 유지해야한다는 이점이 있으므로 (예 : map 또는 reduce)지도를 반복하는 작업을 수행 할 때 항목을 삽입 할 때와 같은 순서로 항목을 추가하십시오.

지속적 컬렉션 개념에서 "배열"을 반복적으로 수정하면 어떤 시점에서 해시 맵이됩니다. 예 :

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 

기본적으로 키 순서가 마음에 들지 않으면 항상 해시 맵을 선호합니다. 또한 배열 맵을 사용하는 경우 조회 성능 상충 관계를 염두에 두어야합니다.