উত্তর:
এগুলি খুব আলাদা উপায়ে প্রয়োগ করা হয়।
hash_map
( unordered_map
টিআর 1 এবং বুস্টে; পরিবর্তে সেগুলি ব্যবহার করুন) একটি হ্যাশ টেবিল ব্যবহার করুন যেখানে টেবিলের একটি স্লটে কী হ্যাশ করা হবে এবং মানটি সেই চাবিটির সাথে তালিকায় থাকা একটি তালিকায় সংরক্ষণ করা হবে।
map
ভারসাম্য বাইনারি অনুসন্ধান গাছ হিসাবে সাধারণত প্রয়োগ করা হয় (সাধারণত একটি লাল / কালো গাছ)।
একটি unordered_map
সংগ্রহ মৌলকে ব্যবহার করার জন্য সামান্য ভাল পারফরম্যান্স দিতে হবে, কিন্তু একটি map
(যেমন এটা সাজানো ক্রম, যা শুরু থেকে শেষ পর্যন্ত ট্র্যাভেরসাল পারবেন মধ্যে সংরক্ষিত হয়) অতিরিক্ত দরকারী বৈশিষ্ট্য থাকবে। unordered_map
সন্নিবেশ করাতে এবং মুছতে দ্রুত হবে map
।
hash_map
অনেক লাইব্রেরি বাস্তবায়ন দ্বারা সরবরাহ করা একটি সাধারণ এক্সটেনশন ছিল। ঠিক এই কারণেই unordered_map
যখন এটি টিআর 1 এর অংশ হিসাবে সি ++ স্ট্যান্ডার্ডে যুক্ত করা হয়েছিল তখন এর নামকরণ করা হয়েছিল। মানচিত্রটি সাধারণত একটি লাল-কালো গাছের মতো ভারসাম্য বাইনারি গাছের সাথে প্রয়োগ করা হয় (প্রয়োগগুলি অবশ্যই পৃথকভাবে পৃথক হয়)। hash_map
এবং unordered_map
সাধারণত হ্যাশ টেবিলগুলি দিয়ে প্রয়োগ করা হয়। এভাবে অর্ডার বজায় থাকে না। unordered_map
সন্নিবেশ / মুছুন / ক্যোয়ারি হবে ও (1) (ধ্রুবক সময়) যেখানে মানচিত্রটি ও (লগ এন) হবে যেখানে এন ডাটা স্ট্রাকচারের আইটেমের সংখ্যা। তাই unordered_map
দ্রুত, এবং যদি আপনি আইটেমগুলির ক্রমটি যত্ন না করেন তবে তার চেয়ে বেশি পছন্দ করা উচিত map
। কখনও কখনও আপনি অর্ডার বজায় রাখতে চান (কী দ্বারা নির্দেশিত) এবং এটির জন্য map
পছন্দ হবে।
কিছু মূল পার্থক্য জটিলতার প্রয়োজনীয়তার মধ্যে রয়েছে।
একটি map
প্রয়োজন O(log(N))
যেমন একটি হিসাবে প্রয়োগ করা যাচ্ছে, টিপে এবং খুঁজে বের করে অপারেশনের জন্য সময় লাল-কালো বৃক্ষ ডাটা স্ট্রাকচার।
একটি unordered_map
একজন 'গড়' সময়ের প্রয়োজন O(1)
টিপে এবং খুঁজে বের করে, কিন্তু একটি খারাপ-কেস সময় রাখার অনুমতি পায় O(N)
। এটি হ্যাশ টেবিল ডেটা স্ট্রাকচার ব্যবহার করে প্রয়োগ করা হয়েছে ।
সুতরাং, সাধারণত, unordered_map
দ্রুত হবে তবে কীগুলি এবং আপনার সংরক্ষণ করা হ্যাশ ফাংশনের উপর নির্ভর করে আরও খারাপ হতে পারে।
সি ++ স্পপটি এসটিএল ধারকগুলির জন্য আপনাকে অবশ্যই কোন অ্যালগরিদম ব্যবহার করতে হবে তা বলে না। এটি অবশ্য তাদের কর্মক্ষমতাতে কিছুটা প্রতিবন্ধকতা তৈরি করে, যা হ্যাশ টেবিলগুলি map
এবং অন্যান্য এসোসিয়েটিভ পাত্রে ব্যবহারের বিষয়টি অস্বীকার করে । (এগুলি সাধারণত লাল / কালো গাছের সাথে প্রয়োগ করা হয়)) হ্যাশ টেবিলগুলি বিতরণ করতে পারে তার চেয়ে এই পাত্রে জন্য এই সীমাবদ্ধতার জন্য সবচেয়ে খারাপ-খারাপ পারফরম্যান্স প্রয়োজন।
অনেক লোক সত্যিই হ্যাশ টেবিলগুলি চান না, তবে হ্যাশ-ভিত্তিক এসটিএল এসোসিয়েটিভ পাত্রে বছরের পর বছর ধরে একটি সাধারণ বর্ধন ছিল। ফলস্বরূপ, তারা unordered_map
সি ++ স্ট্যান্ডার্ডের পরবর্তী সংস্করণগুলিতে যুক্ত হয়েছিল ।
map
সাধারণত একটি ভারসাম্য btree কারণ operator<()
অবস্থান নির্ধারণের উপায় হিসাবে ব্যবহার করার কারণে ছিল ।
map
balanced binary search tree
(সাধারণত ক rb_tree
) থেকে প্রয়োগ করা হয় , যেহেতু এতে থাকা সমস্ত সদস্যকে balanced binary search tree
সাজানো হয় তাই মানচিত্র;
hash_map
থেকে বাস্তবায়িত হয় hashtable
.Since সব সদস্য hashtable
unsorted হয় তাই সদস্যদের মধ্যে hash_map(unordered_map)
সাজানো নয়।
hash_map
কোনও সি ++ স্ট্যান্ডার্ড লাইব্রেরি নয়, তবে এখন এটির নাম পরিবর্তন করে unordered_map
(আপনি এটির পুনরায় নামকরণের কথা ভাবতে পারেন) এবং সি ++ স্ট্যান্ডার্ড লাইব্রেরি হয়ে যায় যেহেতু সি ++ 11 এই প্রশ্নটি দেখুন হ্যাশ_ম্যাপ এবং আনর্ডার্ড_ম্যাপের মধ্যে পার্থক্য? আরও বিশদ জন্য।
নীচে আমি দুই ধরণের মানচিত্র কীভাবে প্রয়োগ করা হয় তার উত্স কোড থেকে কিছু মূল ইন্টারফেস দেব।
নীচের কোডটি কেবল এটি দেখানোর জন্যই, মানচিত্রটি কেবল একটি র্যাপার হয় 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 টি বালতি রয়েছে এবং কিছু মান সন্নিবেশ করা হয়, এটি অভ্যন্তরীণ কাঠামো।
নীচের চিত্রটি মানচিত্র এবং হ্যাশ_ম্যাপ (আনর্ডার্ড_ম্যাপ) এর মধ্যে কিছু পার্থক্য দেখায়, চিত্রটি কীভাবে মানচিত্র এবং আনর্ডারড_ম্যাপের মধ্যে নির্বাচন করতে হয় তা থেকে আসে ? :
আমি কী জানি তা জানিনা, তবে, হ্যাশ_ম্যাপটি () 150 কে স্বাক্ষরযুক্ত পূর্ণসংখ্যা কী এবং ভাসমান মানগুলি সাফ করতে 20 সেকেন্ডের বেশি সময় নেয় takes আমি কেবল চালিয়ে যাচ্ছি এবং অন্য কারও কোড পড়ছি।
এটি হ্যাশ_ম্যাপকে অন্তর্ভুক্ত করে।
#include "StdAfx.h"
#include <hash_map>
আমি এটি এখানে পড়ছি https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
পরিষ্কার করে বলা () হ'ল ও (এন) এর আদেশ। আমার কাছে এটি খুব আশ্চর্যজনক, তবে এটি এইভাবে।