2014-09-26 34 views
10

क्लोजर में एक सरणी-नक्शा और हैश-नक्शा है, मैं दोनों के बीच का अंतर नहीं समझ पाया। क्या कोई उदाहरण के साथ संभव हो सकता है कि उनमें से किसी एक का उपयोग कब किया जाएगा?क्लोजर में हैश-मानचित्र और सरणी-मानचित्र के बीच क्या अंतर है?

उत्तर

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 

मूल रूप से, यदि आप कुंजी आदेश की परवाह नहीं करते हैं तो हमेशा हैश मानचित्र पसंद करते हैं। इसके अलावा, यदि आप सरणी मानचित्र का उपयोग करते हैं, तो लुकअप प्रदर्शन ट्रेडऑफ़ को ध्यान में रखें।

संबंधित मुद्दे