hash table c programs implement hash table
यह ट्यूटोरियल C ++ हैश टेबल्स और हैश मैप्स को समझाता है। आप Hash Table Applications और C ++ में कार्यान्वयन के बारे में भी जानेंगे:
हैशिंग एक ऐसी तकनीक है जिसके उपयोग से हम 'हैश फ़ंक्शन' का उपयोग करके बड़ी मात्रा में डेटा को एक छोटी तालिका में मैप कर सकते हैं।
हैशिंग तकनीक का उपयोग करते हुए, हम अन्य खोज तकनीकों जैसे कि रैखिक और बाइनरी खोज की तुलना में डेटा को अधिक तेज़ी और कुशलता से खोज सकते हैं।
आइए हम इस ट्यूटोरियल में एक उदाहरण के साथ हैशिंग तकनीक को समझें।
=> आसान सी ++ प्रशिक्षण श्रृंखला के माध्यम से पढ़ें।
आप क्या सीखेंगे:
सी ++ में हाशिंग
आइए हम एक महाविद्यालय पुस्तकालय का उदाहरण लेते हैं जिसमें हजारों पुस्तकें हैं। पुस्तकों को विषयों, विभागों आदि के अनुसार व्यवस्थित किया जाता है, लेकिन फिर भी, प्रत्येक खंड में कई पुस्तकें होंगी, जिससे पुस्तकों की खोज अत्यधिक कठिन हो जाती है।
इस प्रकार, इस कठिनाई को दूर करने के लिए हम प्रत्येक पुस्तक को एक अद्वितीय संख्या या कुंजी प्रदान करते हैं ताकि हम तुरंत पुस्तक के स्थान को जान सकें। यह वास्तव में हैशिंग के माध्यम से प्राप्त किया जाता है।
अपने पुस्तकालय उदाहरण के साथ जारी रखते हुए, अपने विभाग, विषय, अनुभाग आदि के आधार पर प्रत्येक पुस्तक की पहचान करने के परिणामस्वरूप, जो बहुत लंबी स्ट्रिंग हो सकती है, हम एक अद्वितीय फ़ंक्शन का उपयोग करके लाइब्रेरी में प्रत्येक पुस्तक के लिए एक अद्वितीय पूर्णांक मान या कुंजी की गणना करते हैं और इन कुंजियों को एक अलग तालिका में संग्रहीत करें।
ऊपर उल्लिखित अद्वितीय फ़ंक्शन को 'हैश फ़ंक्शन' कहा जाता है और अलग तालिका को 'हैश टेबल' कहा जाता है। हैश तालिका में किसी विशेष विशिष्ट कुंजी को दिए गए मान को मैप करने के लिए एक हैश फ़ंक्शन का उपयोग किया जाता है। इसके परिणामस्वरूप तत्वों का तेजी से उपयोग होता है। हैशिंग फ़ंक्शन जितना अधिक कुशल होता है, उतना ही अधिक कुशल प्रत्येक तत्व की अद्वितीय कुंजी को मैप करना होगा।
आइए एक हैश फ़ंक्शन पर विचार करें ज (x) वह मूल्य ' एक्स '' x% 10 'सरणी में। दिए गए डेटा के लिए, हम एक हैश टेबल बना सकते हैं जिसमें कीज़ या हैश कोड या हेज़ नीचे दिए गए चित्र में दिखाए गए हैं।
उपरोक्त आरेख में, हम देख सकते हैं कि सरणी में प्रविष्टियाँ हैश फ़ंक्शन का उपयोग करके हैश तालिका में अपने स्थान पर मैप की जाती हैं।
इस प्रकार हम कह सकते हैं कि हैशिंग दो चरणों का उपयोग करके लागू किया गया है जैसा कि नीचे उल्लेख किया गया है:
# 1) मान एक हैश फ़ंक्शन का उपयोग करके एक अद्वितीय पूर्णांक कुंजी या हैश में परिवर्तित हो जाता है। इसका उपयोग मूल तत्व को संग्रहीत करने के लिए एक सूचकांक के रूप में किया जाता है, जो हैश तालिका में आता है।
आवश्यकताओं से परीक्षण के मामले कैसे लिखें
उपरोक्त आरेख में, हैश तालिका में मान 1 आरेख के LHS पर दिए गए डेटा सरणी से तत्व 1 को संग्रहीत करने के लिए अद्वितीय कुंजी है।
#दो) डेटा सरणी से तत्व हैश तालिका में संग्रहीत किया जाता है जहां इसे हैश कुंजी का उपयोग करके जल्दी से पुनर्प्राप्त किया जा सकता है। उपरोक्त आरेख में, हमने देखा कि हमने हैश फ़ंक्शन का उपयोग करके अपने संबंधित स्थानों की गणना करने के बाद सभी तत्वों को हैश तालिका में संग्रहीत किया है। हम हैश मूल्यों और सूचकांक को पुनः प्राप्त करने के लिए निम्नलिखित अभिव्यक्तियों का उपयोग कर सकते हैं।
hash = hash_func(key) index = hash % array_size
हैश फंकशन
हमने पहले ही उल्लेख किया है कि मैपिंग की दक्षता हैश फ़ंक्शन की दक्षता पर निर्भर करती है जो हम उपयोग करते हैं।
एक हैश फ़ंक्शन मूल रूप से निम्नलिखित आवश्यकताओं को पूरा करना चाहिए:
- गणना करने में आसान: एक हैश फ़ंक्शन, अद्वितीय कुंजियों की गणना करने के लिए आसान होना चाहिए।
- कम टकराव: जब तत्व समान कुंजी मानों के बराबर होते हैं, तो टकराव होता है। उपयोग किए जाने वाले हैश फ़ंक्शन में जहां तक संभव हो न्यूनतम टकराव होना चाहिए। जैसा कि टकराव होने के लिए बाध्य हैं, हमें टक्करों की देखभाल के लिए उचित टक्कर संकल्प तकनीकों का उपयोग करना होगा।
- वर्दी वितरण: हैश फ़ंक्शन के परिणामस्वरूप हैश तालिका में डेटा का एक समान वितरण होता है और जिससे क्लस्टरिंग को रोका जा सकता है।
हैश टेबल C ++
हैश टेबल या हैश मैप एक डेटा संरचना है जो मूल डेटा सरणी के तत्वों को इंगित करता है।
हमारे पुस्तकालय उदाहरण में, पुस्तकालय के लिए हैश तालिका में पुस्तकालय की प्रत्येक पुस्तक के संकेत होंगे।
हैश तालिका में प्रविष्टियां होने से सरणी में किसी विशेष तत्व को खोजना आसान हो जाता है।
जैसा कि पहले ही देखा जा चुका है, हैश टेबल इंडेक्स को बकेट या स्लॉट के एरे में गणना करने के लिए एक हैश फंक्शन का उपयोग करता है, जिसमें वांछित मान पाया जा सकता है।
निम्नलिखित डेटा सरणी के साथ एक और उदाहरण पर विचार करें:
मान लें कि हमारे पास आकार 10 की हैश तालिका है जैसा कि नीचे दिखाया गया है:
अब नीचे दिए गए हैश फ़ंक्शन का उपयोग करें।
Hash_code = Key_value % size_of_hash_table
यह Hash_code = के बराबर होगा Key_value% 10
उपरोक्त फ़ंक्शन का उपयोग करते हुए, हम मुख्य मानों को हैश तालिका स्थानों पर मैप करते हैं जैसा कि नीचे दिखाया गया है।
डेटा आइटम | हैश फंकशन | हैश कोड |
---|---|---|
२२ | 22% 10 = 2 | दो |
२५ | 25% 10 = 5 | ५ |
२। | 27% 10 = 7 | । |
४६ | 46% 10 = 6 | ६ |
.० | 70% 10 = 0 | ० |
89. है | 89% 10 = 9 | ९ |
३१ | 31% 10 = 1 | 1 |
उपरोक्त तालिका का उपयोग करते हुए, हम निम्न तालिका हैश तालिका का प्रतिनिधित्व कर सकते हैं।
इस प्रकार जब हमें किसी तत्व को हैश टेबल से एक्सेस करने की आवश्यकता होती है, तो सर्च करने में O (1) समय लगेगा।
टक्कर
हम आमतौर पर हैश फ़ंक्शन का उपयोग करके हैश कोड की गणना करते हैं ताकि हम हैश तालिका में हैश कोड के लिए महत्वपूर्ण मान को मैप कर सकें। डेटा ऐरे के उपरोक्त उदाहरण में, मान 12 डालें। उस स्थिति में, कुंजी मान 12 के लिए हैश_कोड 2. होगा (12% 10 = 2)।
लेकिन हैश तालिका में, हमारे पास पहले से ही हैश_कोड 2 के लिए कुंजी-मूल्य 22 पर मैपिंग है जैसा कि नीचे दिखाया गया है:
जैसा कि ऊपर दिखाया गया है, हमारे पास दो मानों के लिए समान हैश कोड है, 12 और 22 अर्थात् 2. जब एक या एक से अधिक प्रमुख मान एक ही स्थान के बराबर होते हैं, तो इसका परिणाम टकराव होता है। इस प्रकार हैश कोड स्थान पर पहले से ही एक प्रमुख मूल्य का कब्जा है और एक और महत्वपूर्ण मूल्य है जिसे उसी स्थान पर रखा जाना चाहिए।
हैशिंग के मामले में, यहां तक कि अगर हमारे पास बहुत बड़े आकार की हैश तालिका है, तो एक टक्कर होना तय है। ऐसा इसलिए है क्योंकि हम सामान्य रूप से एक बड़ी कुंजी के लिए एक छोटा सा अद्वितीय मान पाते हैं, इसलिए किसी भी समय एक ही हैश कोड के लिए एक या अधिक मूल्य के लिए पूरी तरह से संभव है।
यह देखते हुए कि हैशिंग में एक टक्कर अपरिहार्य है, हमें हमेशा टकराव को रोकने या हल करने के तरीकों की तलाश करनी चाहिए। विभिन्न टकराव समाधान तकनीकें हैं जिन्हें हम हैशिंग के दौरान होने वाली टक्कर को हल करने के लिए नियोजित कर सकते हैं।
टक्कर संकल्प तकनीक
निम्नलिखित तकनीकें हैं जिन्हें हम हैश तालिका में टकराव को हल करने के लिए नियोजित कर सकते हैं।
अलग चेनिंग (ओपन हैशिंग)
यह सबसे आम टक्कर संकल्प तकनीक है। इसे ओपन हैशिंग के रूप में भी जाना जाता है और इसे एक लिंक्ड सूची का उपयोग करके लागू किया जाता है।
.7z फ़ाइल क्या है
अलग-अलग चेनिंग तकनीक में, हैश तालिका में प्रत्येक प्रविष्टि एक लिंक की गई सूची है। जब कुंजी हैश कोड से मेल खाती है, तो उस विशेष हैश कोड के अनुरूप सूची में दर्ज किया जाता है। इस प्रकार जब दो कुंजी में समान हैश कोड होता है, तो दोनों प्रविष्टियों को लिंक की गई सूची में दर्ज किया जाता है।
ऊपर दिए गए उदाहरण के लिए, अलग चेंजिंग का प्रतिनिधित्व नीचे किया गया है।
उपरोक्त आरेख चाइनिंग का प्रतिनिधित्व करता है। यहां हम मॉड (%) फ़ंक्शन का उपयोग करते हैं। हम देखते हैं कि जब दो प्रमुख मूल्य समान हैश कोड के बराबर होते हैं, तो हम इन तत्वों को लिंक की गई सूची का उपयोग करके उस हैश कोड से जोड़ते हैं।
यदि कुंजी हैश तालिका में समान रूप से वितरित की जाती हैं, तो किसी विशेष कुंजी को देखने की औसत लागत उस लिंक की गई सूची में कुंजियों की औसत संख्या पर निर्भर करती है। इस प्रकार अलग-अलग चेनिंग तब भी प्रभावी रहती है जब स्लॉट की तुलना में प्रविष्टियों की संख्या में वृद्धि होती है।
अलग-अलग चेनिंग के लिए सबसे खराब स्थिति तब होती है जब सभी कुंजी समान हैश कोड के बराबर होती हैं और इस प्रकार केवल एक लिंक की गई सूची में डाली जाती हैं। इसलिए, हमें हैश तालिका में सभी प्रविष्टियों को देखने की आवश्यकता है और लागत जो तालिका में कुंजियों की संख्या के आनुपातिक हैं।
रैखिक जांच (ओपन एड्रेसिंग / क्लोज्ड हैशिंग)
खुले पते या रैखिक जांच तकनीक में, सभी प्रवेश रिकॉर्ड हैश तालिका में ही संग्रहीत किए जाते हैं। जब हैश कोड के लिए की-वैल्यू मैप्स और हैश कोड द्वारा इंगित की गई स्थिति को खाली नहीं किया जाता है, तो उस स्थान पर कुंजी मूल्य डाला जाता है।
यदि स्थिति पहले से ही कब्जा कर ली गई है, तो एक परिक्षण अनुक्रम का उपयोग करके महत्वपूर्ण मान अगली स्थिति में डाला जाता है जो हैश तालिका में अप्रकाशित है।
रैखिक जांच के लिए, हैश फ़ंक्शन नीचे दिखाए अनुसार बदल सकता है:
हैश = हैश% hashTableSize
हैश = (हैश + 1)% हैशटेबलसाइज़
हैश = (हैश + २)% हैशटेबलाइज़
हैश = (हैश + 3)% हैशटेबलसाइज़
हम देखते हैं कि स्लॉट या क्रमिक जांच के बीच के अंतराल की रैखिक जांच के मामले में स्थिर है यानी 1।
उपरोक्त आरेख में, हम देखते हैं कि 0 मेंवेंस्थान हम हैश फ़ंक्शन 'हैश = हैश% hash_tableSize' का उपयोग करके 10 दर्ज करते हैं।
अब तत्व 70 भी हैश तालिका में स्थान 0 के बराबर है। लेकिन उस स्थान पर पहले से ही कब्जा है। इसलिए रैखिक परिवीक्षा का उपयोग करके हम अगला स्थान प्राप्त करेंगे जो 1. है। जैसा कि यह स्थान अप्रकाशित है, हम इस स्थान पर कुंजी 70 को एक तीर का उपयोग करके दिखाया गया है।
परिणामी हैश टेबल नीचे दिखाया गया है।
रैखिक जांच 'प्राथमिक क्लस्टरिंग' की समस्या से ग्रस्त हो सकती है जिसमें एक मौका है कि निरंतर कोशिकाओं पर कब्जा हो सकता है और एक नया तत्व डालने की संभावना कम हो जाती है।
साथ ही अगर दो तत्वों को पहले हैश फ़ंक्शन में समान मान मिलता है, तो ये दोनों तत्व समान जांच अनुक्रम का पालन करेंगे।
द्विघात जांच
द्विघात परिवीक्षा एक ही अंतर के साथ रैखिक परिवीक्षा के समान होती है, जिसमें परिवीक्षा के लिए अंतराल का उपयोग किया जाता है। जैसा कि नाम से पता चलता है, यह तकनीक स्लॉट्स पर कब्जा करने के लिए गैर-रैखिक या द्विघात दूरी का उपयोग करती है जब रैखिक दूरी के बजाय टकराव होता है।
द्विघात जांच में, स्लॉट्स के बीच का अंतराल पहले से ही हैशेड इंडेक्स में एक मनमाना बहुपद मूल्य जोड़कर गणना की जाती है। यह तकनीक प्राथमिक क्लस्टरिंग को एक महत्वपूर्ण सीमा तक कम कर देती है लेकिन माध्यमिक क्लस्टरिंग में सुधार नहीं करती है।
डबल हैशिंग
डबल हैशिंग तकनीक रैखिक जांच के समान है। डबल हैशिंग और रैखिक जांच में एकमात्र अंतर यह है कि डबल हैशिंग तकनीक में प्रोबिंग के लिए उपयोग किए जाने वाले अंतराल को दो हैशिंग फ़ंक्शन का उपयोग करके गणना की जाती है। चूंकि हम हैश फ़ंक्शन को एक के बाद एक कुंजी पर लागू करते हैं, यह प्राथमिक क्लस्टरिंग के साथ-साथ माध्यमिक क्लस्टरिंग को भी समाप्त करता है।
चेनिंग (ओपन हैशिंग) और रैखिक जांच (ओपन एड्रेसिंग) के बीच अंतर
चेनिंग (ओपन हैशिंग) | रैखिक जांच (खुला पता) |
---|---|
मुख्य मूल्यों को एक अलग लिंक की गई सूची का उपयोग करके तालिका के बाहर संग्रहीत किया जा सकता है। | मुख्य मानों को केवल तालिका के अंदर संग्रहीत किया जाना चाहिए। |
हैश तालिका में तत्वों की संख्या हैश तालिका के आकार से अधिक हो सकती है। | हैश तालिका में मौजूद तत्वों की संख्या हैश तालिका में सूचकांकों की संख्या से अधिक नहीं होगी। |
विलोपन तकनीक का पीछा करने में कुशल है। | हटना बोझिल हो सकता है। आवश्यकता न होने पर टाला जा सकता है। |
चूंकि प्रत्येक स्थान के लिए एक अलग लिंक की गई सूची बनाए रखी गई है, इसलिए लिया गया स्थान बड़ा है। | चूंकि सभी प्रविष्टियों को एक ही तालिका में समायोजित किया गया है, इसलिए लिया गया स्थान कम है। |
सी ++ हैश टेबल कार्यान्वयन
हैश टेबल को प्रोग्राम करने के लिए हम सरणियों या लिंक्ड सूची का उपयोग करके हैशिंग को लागू कर सकते हैं। C ++ में हमारे पास 'हैश मैप' नाम की एक सुविधा भी है जो कि हैश टेबल के समान एक संरचना है लेकिन प्रत्येक प्रविष्टि एक कुंजी-मूल्य जोड़ी है। C ++ में इसका हैश मैप या केवल एक मैप है। C ++ में हैश मैप आमतौर पर अनियंत्रित होता है।
C ++ के मानक टेम्पलेट लाइब्रेरी (STL) में परिभाषित एक हेडर है जो मानचित्रों की कार्यक्षमता को लागू करता है। हमने कवर किया है एसटीएल मैप्स एसटीएल पर हमारे ट्यूटोरियल में विस्तार से।
निम्न कार्यान्वयन हैश तालिका के लिए डेटा संरचना के रूप में लिंक की गई सूचियों का उपयोग करते हुए हैशिंग के लिए है। हम इस कार्यान्वयन में टकराव समाधान तकनीक के रूप में 'चेनिंग' का भी उपयोग करते हैं।
#include #include using namespace std; class Hashing { int hash_bucket; // No. of buckets // Pointer to an array containing buckets list *hashtable; public: Hashing(int V); // Constructor // inserts a key into hash table void insert_key(int val); // deletes a key from hash table void delete_key(int key); // hash function to map values to key int hashFunction(int x) { return (x % hash_bucket); } void displayHash(); }; Hashing::Hashing(int b) { this->hash_bucket = b; hashtable = new list (hash_bucket); } //insert to hash table void Hashing::insert_key(int key) { int index = hashFunction(key); hashtable(index).push_back(key); } void Hashing::delete_key(int key) { // get the hash index for key int index = hashFunction(key); // find the key in (inex)th list list :: iterator i; for (i = hashtable(index).begin(); i != hashtable(index).end(); i++) { if (*i == key) break; } // if key is found in hash table, remove it if (i != hashtable(index).end()) hashtable(index).erase(i); } // display the hash table void Hashing::displayHash() { for (int i = 0; i ' << x; cout << endl; } } // main program int main() { // array that contains keys to be mapped int hash_array() = {11,12,21, 14, 15}; int n = sizeof(hash_array)/sizeof(hash_array(0)); Hashing h(7); // Number of buckets = 7 //insert the keys into the hash table for (int i = 0; i < n; i++) h.insert_key(hash_array(i)); // display the Hash table cout<<'Hash table created:'< आउटपुट:
हैश तालिका बनाई गई:
0 -> 21 -> 14
1 -> 15
दो
३
4 -> 11
५ -> १२
६
कुंजी 12 को हटाने के बाद हैश तालिका:
0 -> 21 -> 14
1 -> 15
दो
३
4 -> 11
५
६
आउटपुट एक हैश तालिका दिखाता है जो आकार 7 से बना है। हम टकराव को हल करने के लिए चेनिंग का उपयोग करते हैं। हम चाबियों को हटाने के बाद हैश तालिका प्रदर्शित करते हैं।
हाशिंग के अनुप्रयोग
# 1) पासवर्डों का सत्यापन: पासवर्ड का सत्यापन आमतौर पर क्रिप्टोग्राफिक हैश फ़ंक्शन का उपयोग करके किया जाता है। जब पासवर्ड दर्ज किया जाता है, तो सिस्टम पासवर्ड के हैश की गणना करता है और फिर सत्यापन के लिए सर्वर पर भेजा जाता है। सर्वर पर, मूल पासवर्ड के हैश मान संग्रहीत किए जाते हैं।
# 2) डेटा संरचनाएं: विभिन्न डेटा संरचनाएं जैसे C ++ में unordered_set और unordered_map, Java में python या C #, HashSet और hash मैप में शब्दकोश सभी कुंजी-मूल्य जोड़ी का उपयोग करते हैं जिसमें अद्वितीय मान होते हैं। विभिन्न कुंजियों के लिए मान समान हो सकते हैं। इन डेटा संरचनाओं को लागू करने के लिए हैशिंग का उपयोग किया जाता है।
# 3) संदेश डाइजेस्ट: यह अभी तक एक अन्य एप्लिकेशन है जो क्रिप्टोग्राफिक हैश का उपयोग करता है। संदेश पचाने में, हम भेजे और प्राप्त किए गए या यहां तक कि फ़ाइलों के लिए हैश की गणना करते हैं और संग्रहीत मूल्यों के साथ उनकी तुलना करते हैं ताकि यह सुनिश्चित हो सके कि डेटा फ़ाइलों के साथ छेड़छाड़ नहीं की गई है। यहाँ सबसे आम एल्गोरिथ्म 'SHA 256' है।
# 4) कंपाइलर ऑपरेशन: जब कंपाइलर किसी प्रोग्राम को कंपाइल करता है, तो प्रोग्रामिंग लैंग्वेज के कीवर्ड दूसरे आइडेंटिटी से अलग तरीके से स्टोर किए जाते हैं। कंपाइलर इन कीवर्ड्स को स्टोर करने के लिए हैश टेबल का इस्तेमाल करता है।
# 5) डाटाबेस इंडेक्सिंग: हैश टेबल का उपयोग डेटाबेस इंडेक्सिंग और डिस्क-आधारित डेटा संरचनाओं के लिए किया जाता है।
# 6) सहयोगी एरेज़: साहचर्य सरणियाँ सरणियाँ हैं जिनके सूचक पूर्णांक जैसे तार या अन्य वस्तु प्रकारों के अलावा डेटा प्रकार के होते हैं। हैश टेबल का उपयोग सहयोगी सरणियों को लागू करने के लिए किया जा सकता है।
शुरुआती लोगों के लिए कंप्यूटर प्रोग्राम कैसे बनाएं
निष्कर्ष
हैशिंग सबसे व्यापक रूप से उपयोग की जाने वाली डेटा संरचना है क्योंकि इसे डालने, हटाने और खोज कार्यों के लिए निरंतर समय O (1) लगता है। हैशिंग ज्यादातर एक हैश फ़ंक्शन का उपयोग करके कार्यान्वित किया जाता है जो बड़े डेटा प्रविष्टियों के लिए एक अद्वितीय छोटे कुंजी मूल्य की गणना करता है। हम सरणियों और लिंक्ड सूचियों का उपयोग करके हैशिंग को लागू कर सकते हैं।
जब भी एक या एक से अधिक डेटा प्रविष्टियां कुंजियों के समान मूल्यों के बराबर होती हैं, तो इसका परिणाम टकराव होता है। हमने रैखिक टक्कर, चैनिंग आदि सहित विभिन्न टकराव संकल्प तकनीकों को देखा है। हमने C ++ में हैशिंग का कार्यान्वयन भी देखा है।
निष्कर्ष निकालने के लिए, हम कह सकते हैं कि हैशिंग प्रोग्रामिंग दुनिया की सबसे कुशल डेटा संरचना है।
=> संपूर्ण सी ++ प्रशिक्षण श्रृंखला यहां देखें।
अनुशंसित पाठ
- निर्णय तालिका तकनीक का उपयोग करके जटिल व्यावसायिक तर्क परीक्षण परिदृश्य कैसे लिखें
- फील्ड वैलिडेशन टेबल (FVT): फील्ड वैलिडेशन के लिए एक टेस्ट डिजाइन तकनीक
- QTP ट्यूटोरियल # 15 - QTP में टेक्स्ट एरिया, टेबल और पेज चेकपॉइंट्स का उपयोग करना
- एसटीएल में एमएपीएस
- सभी राउटर के बारे में: राउटर के प्रकार, रूटिंग टेबल और आईपी रूटिंग
- शीर्ष 40 सर्वश्रेष्ठ MySQL साक्षात्कार प्रश्न और उत्तर (2021 प्रश्न)
- शीर्ष 90 SQL साक्षात्कार प्रश्न और उत्तर (नवीनतम)
- यूनिक्स यूटिलिटीज प्रोग्राम्स कमांड्स: व्हेन, मैन, फाइंड सू, सूडो (पार्ट डी)