Clojure에는 배열 맵과 해시 맵이 있으므로이 두 테이블의 차이점을 파악할 수 없습니다. 누구든지 가능한 경우 예를 들어 설명해 줄 수 있습니까?클로저에서 해시 맵과 배열 맵의 차이점은 무엇입니까?
10
A
답변
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
기본적으로 키 순서가 마음에 들지 않으면 항상 해시 맵을 선호합니다. 또한 배열 맵을 사용하는 경우 조회 성능 상충 관계를 염두에 두어야합니다.