जवाबों:
उन्हें बहुत अलग तरीकों से लागू किया जाता है।
hash_map
( unordered_map
टीआर 1 और बूस्ट में; इसके बजाय उन का उपयोग करें) एक हैश तालिका का उपयोग करें जहां कुंजी को तालिका में एक स्लॉट में रखा जाता है और मूल्य उस कुंजी से जुड़ी सूची में संग्रहीत होता है।
map
एक संतुलित बाइनरी सर्च ट्री (आमतौर पर लाल / काला पेड़) के रूप में लागू किया जाता है।
एक unordered_map
संग्रह के ज्ञात तत्वों तक पहुँचने के लिए थोड़ा बेहतर प्रदर्शन देने चाहिए, लेकिन एक map
(जैसे यह क्रमबद्ध आदेश है, जो शुरू से आखिर तक ट्रेवर्सल की अनुमति देता है में संग्रहित है) अतिरिक्त उपयोगी विशेषताओं होगा। unordered_map
डालने पर और तेज़ हो जाएगा और एक से हटा देगा map
।
hash_map
कई पुस्तकालय कार्यान्वयन द्वारा प्रदान किया गया एक सामान्य विस्तार था। यही कारण है कि unordered_map
TR1 के भाग के रूप में इसे C ++ मानक में जोड़ने पर इसका नाम बदल दिया गया। नक्शा आमतौर पर एक संतुलित बाइनरी ट्री के साथ लागू किया जाता है जैसे लाल-काला पेड़ (कार्यान्वयन अलग-अलग होते हैं)। hash_map
और unordered_map
आम तौर पर हैश टेबल के साथ लागू किया जाता है। इस प्रकार आदेश का रखरखाव नहीं किया जाता है। unordered_map
डालें / हटाएं / क्वेरी ओ (1) (निरंतर समय) होगी जहां मानचित्र ओ (लॉग एन) होगा जहां एन डेटा संरचना में वस्तुओं की संख्या है। तो unordered_map
तेज है, और यदि आप आइटम के आदेश के बारे में परवाह नहीं करते हैं, तो इसे प्राथमिकता दी जानी चाहिए map
। कभी-कभी आप ऑर्डर बनाए रखना चाहते हैं (कुंजी द्वारा आदेश दिया गया) और इसके लिए map
विकल्प होगा।
कुछ प्रमुख अंतर जटिलता आवश्यकताओं में हैं।
एक map
आवश्यकता O(log(N))
के रूप में यह एक के रूप में लागू है, आवेषण और पाता कार्यों के लिए समय लाल काला पेड़ डेटा संरचना।
एक unordered_map
के एक 'औसत' समय की आवश्यकता है O(1)
आवेषण और पाता है, लेकिन की बुरी से बुरी हालत समय बिताने के लिए अनुमति दी है O(N)
। ऐसा इसलिए है क्योंकि इसे हैश टेबल डेटा संरचना का उपयोग करके लागू किया गया है ।
तो, आमतौर पर, unordered_map
तेजी से होगा, लेकिन आपके द्वारा संग्रहीत कीज़ और हैश फ़ंक्शन के आधार पर, बहुत अधिक खराब हो सकता है।
C ++ कल्पना बिल्कुल नहीं कहती है कि STL कंटेनरों के लिए आपको किस एल्गोरिथ्म का उपयोग करना चाहिए। हालांकि, यह उनके प्रदर्शन पर कुछ बाधाओं को डालता है, जो map
अन्य सहयोगी कंटेनरों के लिए हैश तालिकाओं के उपयोग को नियंत्रित करता है। (वे आम तौर पर लाल / काले पेड़ों के साथ लागू होते हैं।) इन बाधाओं को इन कंटेनरों के लिए बेहतर खराब स्थिति वाले प्रदर्शन की आवश्यकता होती है, जैसे कि हैश टेबल वितरित कर सकते हैं।
बहुत से लोग वास्तव में हैश टेबल चाहते हैं, हालांकि, हैश-आधारित एसटीएल सहयोगी कंटेनर वर्षों से एक सामान्य विस्तार है। नतीजतन, उन्होंने unordered_map
C ++ मानक के बाद के संस्करणों को जोड़ा और इस तरह के।
map
आमतौर पर एक संतुलित btree operator<()
स्थान निर्धारण के साधन के रूप में उपयोग करने के कारण था ।
map
balanced binary search tree
(आमतौर पर rb_tree
) से कार्यान्वित किया जाता है , क्योंकि सभी सदस्य balanced binary search tree
को क्रमबद्ध किया जाता है, इसलिए यह नक्शा है;
hash_map
से कार्यान्वित किया जाता है hashtable
। सभी hashtable
सदस्यों को अलग-थलग कर दिया जाता है, ताकि सदस्यों को hash_map(unordered_map)
क्रमबद्ध न किया जाए।
hash_map
c ++ मानक पुस्तकालय नहीं है, लेकिन अब इसका नाम बदल दिया गया है unordered_map
(आप इसका नाम बदल सकते हैं) और c ++ मानक पुस्तकालय बन जाता है, क्योंकि c ++ 11 इस प्रश्न को hash_map और unordered_map के बीच अंतर करता है? अधिक विस्तार के लिए।
नीचे मैं दो प्रकार का नक्शा कैसे लागू किया जाता है के स्रोत कोड से कुछ मुख्य इंटरफ़ेस देगा।
नीचे दिया गया कोड केवल यह दिखाने के लिए है कि, नक्शा सिर्फ एक आवरण है balanced binary search tree
, लगभग यह सभी फ़ंक्शन केवल फ़ंक्शन को लागू करने के लिए balanced binary search tree
है।
template <typename Key, typename Value, class Compare = std::less<Key>>
class map{
// used for rb_tree to sort
typedef Key key_type;
// rb_tree node value
typedef std::pair<key_type, value_type> value_type;
typedef Compare key_compare;
// as to map, Key is used for sort, Value used for store value
typedef rb_tree<key_type, value_type, key_compare> rep_type;
// the only member value of map (it's rb_tree)
rep_type t;
};
// one construct function
template<typename InputIterator>
map(InputIterator first, InputIterator last):t(Compare()){
// use rb_tree to insert value(just insert unique value)
t.insert_unique(first, last);
}
// insert function, just use tb_tree insert_unique function
//and only insert unique value
//rb_tree insertion time is : log(n)+rebalance
// so map's insertion time is also : log(n)+rebalance
typedef typename rep_type::const_iterator iterator;
std::pair<iterator, bool> insert(const value_type& v){
return t.insert_unique(v);
};
hash_map
:hash_map
से कार्यान्वित किया जाता है hashtable
जिसका ढांचा कुछ इस तरह है:
नीचे दिए गए कोड में, मैं मुख्य भाग दूंगा hashtable
, और फिर देताhash_map
।
// used for node list
template<typename T>
struct __hashtable_node{
T val;
__hashtable_node* next;
};
template<typename Key, typename Value, typename HashFun>
class hashtable{
public:
typedef size_t size_type;
typedef HashFun hasher;
typedef Value value_type;
typedef Key key_type;
public:
typedef __hashtable_node<value_type> node;
// member data is buckets array(node* array)
std::vector<node*> buckets;
size_type num_elements;
public:
// insert only unique value
std::pair<iterator, bool> insert_unique(const value_type& obj);
};
जैसे map's
केवल सदस्य हैrb_tree
, hash_map's
एकमात्र सदस्य है hashtable
। यह नीचे के रूप में मुख्य कोड है:
template<typename Key, typename Value, class HashFun = std::hash<Key>>
class hash_map{
private:
typedef hashtable<Key, Value, HashFun> ht;
// member data is hash_table
ht rep;
public:
// 100 buckets by default
// it may not be 100(in this just for simplify)
hash_map():rep(100){};
// like the above map's insert function just invoke rb_tree unique function
// hash_map, insert function just invoke hashtable's unique insert function
std::pair<iterator, bool> insert(const Value& v){
return t.insert_unique(v);
};
};
नीचे दी गई छवि से पता चलता है कि एक हैश_मैप में 53 बाल्टियाँ हैं, और कुछ मान डालें, यह आंतरिक संरचना है।
नीचे दी गई छवि नक्शे और hash_map (unordered_map) के बीच कुछ अंतर दिखाती है, छवि आती है कि कैसे मानचित्र और unordered_map के बीच चयन करें? :
मुझे नहीं पता कि क्या देता है, लेकिन, hash_map को साफ़ करने के लिए 20 सेकंड से अधिक समय लगता है () 150K अहस्ताक्षरित पूर्णांक कुंजियाँ और फ़्लोट मान। मैं अभी किसी और का कोड चला रहा हूं और पढ़ रहा हूं।
इस तरह इसमें हैश_मैप शामिल है।
#include "StdAfx.h"
#include <hash_map>
मैंने इसे यहाँ पढ़ा https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
यह कहना कि स्पष्ट () O (N) का आदेश है। यह मेरे लिए, बहुत अजीब है, लेकिन, यह जिस तरह से है।