सरल हैश टेबल अवलोकन
एक रिफ्रेशर के रूप में, एक हैश तालिका एक डेटा संरचना में एक विशिष्ट कुंजी के तहत एक मूल्य को संग्रहीत करने का एक तरीका है। उदाहरण के लिए, मैं "a"
कुंजी के नीचे मान को संग्रहीत कर सकता हूं 1
, और बाद 1
में हैश तालिका में कुंजी को देखकर इसे पुनः प्राप्त कर सकता हूं ।
हैश टेबल का सबसे सरल उदाहरण जो मैं सोच सकता हूं कि मेरे सिर के ऊपर एक हैश तालिका है जो केवल पूर्णांकों को संग्रहीत कर सकती है, जहां हैश तालिका प्रविष्टि के लिए कुंजी भी संग्रहीत किया जा रहा मूल्य है। मान लें कि आपकी तालिका आकार 8 की है, और यह मूल रूप से स्मृति में एक सरणी है:
---------------------------------
| | | | | | | | |
---------------------------------
0 1 2 3 4 5 6 7
हैश फंकशन
हैश फ़ंक्शंस आपको एक इंडेक्स देते हैं जहां पर अपने मूल्य को स्टोर करना है। इस तालिका के लिए एक बहुत ही सरल हैश फ़ंक्शन आपके द्वारा संग्रहित किए जाने वाले मान में 1 जोड़ना होगा, और फिर इसे 8 (तालिका तालिका) में मॉडिफाई करना होगा। दूसरे शब्दों में, आपका हैश फ़ंक्शन है (n+1)%8
, जहां n
पूर्णांक आप स्टोर करना चाहते हैं।
इंसर्ट
यदि आप इस हैश तालिका में एक मूल्य सम्मिलित करना चाहते हैं, तो आप अपने हैश फ़ंक्शन (इस मामले में (n+1)%8
) को उस मूल्य पर कॉल करते हैं जिसे आप एक इंडेक्स देने के लिए सम्मिलित करना चाहते हैं। उदाहरण के लिए, यदि हम 14 सम्मिलित करना चाहते हैं, तो हम कॉल करेंगे (14 + 1) % 8
और सूचकांक प्राप्त करेंगे 7
, इसलिए हम इसे सूचकांक में मान डालेंगे 7
।
---------------------------------
| | | | | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
इसी तरह, हम 33, 82 और 191 को सम्मिलित कर सकते हैं:
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
टक्कर
लेकिन अगर हम किसी ऐसी चीज को डालने की कोशिश करें जो एक प्रविष्टि से टकरा जाए तो क्या होगा? 2 को इंडेक्स में जाना चाहिए 3
, लेकिन यह 82 द्वारा लिया गया है। इस मुद्दे को हल करने के कई तरीके हैं, सबसे सरल है कि हमारे हैश फ़ंक्शन को बार-बार कॉल करें जब तक कि हम एक खाली स्थान नहीं पाते।
तो तर्क इस प्रकार है:
- (२ + १)% 3 = ३
- इंडेक्स 3 भरा हुआ है
- हमारे हैश फ़ंक्शन में 3 प्लग करें । ( ३ + १)% 4 = ४ , जो खाली है।
- हमारे मूल्य को सूचकांक 4 में रखें ।
अब हैश तालिका इस तरह दिखती है, जिसमें 2 मूल्य सूचकांक पर संग्रहीत हैं 4
।
---------------------------------
|191| |33 |82 |2 | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
इस समाधान के साथ नकारात्मक पक्ष यह है कि बहुत जल्द, हमारी तालिका पूरी हो जाएगी! यदि आप जानते हैं कि आपका डेटा आकार सीमित है, तो यह तब तक कोई समस्या नहीं होनी चाहिए जब तक कि आपकी तालिका सभी संभावित मानों को रखने के लिए पर्याप्त न हो। यदि आप अधिक पकड़ बनाने में सक्षम होना चाहते हैं, तो आप टकरावों को अलग तरीके से संभाल सकते हैं। 2 को सम्मिलित करने से पहले हम उस स्थान पर वापस जाते हैं जहाँ हम थे।
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
यदि आप याद करते हैं, तो (2+1)%8
हमें इंडेक्स देता है 3
, जो लिया जाता है। यदि आप नहीं चाहते हैं कि आपकी हैश टेबल भर जाए, तो आप प्रत्येक टेबल इंडेक्स को लिंक्ड-लिस्ट के रूप में उपयोग कर सकते हैं, और उस इंडेक्स पर सूची में जोड़ सकते हैं। इसलिए हैश फ़ंक्शन को फिर से कॉल करने के बजाय, हम केवल सूची में सूची में जोड़ देंगे 3
:
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
यह सूची तब तक बढ़ सकती है जितनी स्मृति अनुमति देगी। मैं 18 को सम्मिलित कर सकता हूं, और इसे केवल 2 में जोड़ा जाएगा:
-----
|18 |
-----
| 2 |
---------------------------------
|191| |33 |82 | | | |14 |
---------------------------------
0 1 2 3 4 5 6 7
लुकअप
आपकी हैश तालिका में लुकअप मान त्वरित है, यह देखते हुए कि आपकी हैश तालिका बहुत बड़े आकार की है। आप बस अपने हैश फ़ंक्शन को कॉल करें, और इंडेक्स प्राप्त करें। मान लीजिए कि आप देखना चाहते हैं कि 82 आपकी तालिका में है या नहीं। लुकअप फ़ंक्शन (82+1)%8
= पर कॉल करेगा 3
, और इंडेक्स में आइटम को देखेगा 3
, और इसे आपके लिए लौटा देगा। यदि आपने 16 को देखा, तो लुकअप फ़ंक्शन इंडेक्स में दिखेगा 1
, और देखें कि यह मौजूद नहीं है।
लुकअप Coll Collisions की जरूरत है, भी!
यदि आप मान 2 को देखने का प्रयास करते हैं, तो आपकी हैश तालिका में डेटा को पुनः प्राप्त करने के लिए डेटा को संग्रहीत करने के लिए उपयोग किए गए समान टकराव तर्क का उपयोग करना होगा। आपके हैश टेबल के काम करने के तरीके के आधार पर, आप या तो उस कुंजी को हैश करेंगे जब तक कि आपको वह प्रविष्टि नहीं मिल जाती जिसे आप ढूंढ रहे हैं (या रिक्त स्थान खोजें), या आप अपनी लिंक की गई सूची के माध्यम से तब तक पुनरावृत्ति करेंगे जब तक आपको आइटम नहीं मिल जाता (या सूची के अंत तक)
सारांश
तो, हैश टेबल जल्दी से कुंजी-मूल्य जोड़े को संग्रहीत और एक्सेस करने का एक अच्छा तरीका है। इस उदाहरण में हमने मान के रूप में एक ही कुंजी का उपयोग किया है, लेकिन असली दुनिया हैश तालिकाओं में चाबियाँ इतनी सीमित नहीं हैं। हैश फ़ंक्शन इंडेक्स बनाने के लिए कुंजियों पर काम करेगा, और फिर उस इंडेक्स पर कुंजी / मान संग्रहीत किया जा सकता है। हैश टेबल वास्तव में इसके माध्यम से पुनरावृत्त होना नहीं है, हालांकि ऐसा करना संभव है। जैसा कि आप देख सकते हैं, हैश टेबल में बहुत सारे रिक्त स्थान हो सकते हैं, और उनके माध्यम से चलना समय की बर्बादी होगी। भले ही हैश तालिका में इसके पुनरावृत्त में रिक्त स्थान लुकअप को लंघन करने के लिए तर्क है, आप लिंक सूचियों की तरह, पुनरावृत्तियों के लिए डिज़ाइन किए गए डेटा संरचना का उपयोग करके बेहतर अनुकूल होंगे।