हैश टेबल बनाम सहयोगी सरणियाँ


84

हाल ही में मैंने एक बहुत प्रसिद्ध पुस्तक " एल्गोरिदम का परिचय " में हैश-टेबल के बारे में पढ़ा है । मैंने उन्हें अभी तक किसी भी वास्तविक एप्लिकेशन में उपयोग नहीं किया है, लेकिन करना चाहते हैं। लेकिन मुझे नहीं पता कि कैसे शुरू किया जाए। क्या कोई मुझे इसका उपयोग करने के कुछ नमूने दे सकता है, उदाहरण के लिए, हैश-तालिकाओं का उपयोग करके एक शब्दकोश एप्लिकेशन (जैसे एबीबीवाई लिंग्वो) का एहसास कैसे करें? और अंत में मैं जानना चाहूंगा कि PHP में हैश-टेबल और साहचर्य सरणियों के बीच अंतर क्या है, मेरा मतलब है कि मुझे किस तकनीक का उपयोग करना चाहिए और किन स्थितियों में करना चाहिए? अगर मैं गलत हूं (मैं क्षमा चाहता हूं) कृपया मुझे सही करें, क्योंकि वास्तव में मैं हैश-तालिकाओं के साथ शुरू कर रहा हूं और मुझे उनके बारे में सिर्फ बुनियादी (सैद्धांतिक) ज्ञान है। बहुत बहुत धन्यवाद।




जवाबों:


123

PHP में, साहचर्य सरणियों को हैशटेबल्स के रूप में कार्यान्वित किया जाता है, जिसमें थोड़ी अतिरिक्त कार्यक्षमता होती है।

हालाँकि तकनीकी रूप से बोलना, एक साहचर्य सरणी हैशटेबल के समान नहीं है - यह केवल पर्दे के पीछे एक हैशटेबल के साथ लागू किया जाता है। क्योंकि इसका अधिकांश कार्यान्वयन एक हैशटेबल है, यह सब कुछ हैशटेबल कर सकता है - लेकिन यह अधिक भी कर सकता है।

उदाहरण के लिए, आप लूप के लिए एक सहयोगी सरणी के माध्यम से लूप कर सकते हैं, जिसे आप हैशटेबल के साथ नहीं कर सकते।

इसलिए जब वे समान होते हैं, तो एक साहचर्य सरणी वास्तव में एक हैशटेबल का सुपरसेट कर सकती है - इसलिए वे वास्तव में एक ही चीज नहीं हैं। इसे हैशटैब प्लस अतिरिक्त कार्यक्षमता के रूप में सोचें।

कोड उदाहरण:

हैशटेबल के रूप में एक सहयोगी सरणी का उपयोग करना :

$favoriteColor = array();
$favoriteColor['bob']='blue';
$favoriteColor['Peter']='red';
$favoriteColor['Sally']='pink';
echo 'bob likes: '.$favoriteColor['bob']."\n";
echo 'Sally likes: '.$favoriteColor['Sally']."\n";
//output: bob likes blue
//        Sally likes pink

एक साहचर्य सरणी के माध्यम से लूपिंग :

$idTable=array();
$idTable['Tyler']=1;
$idTable['Bill']=20;
$idTable['Marc']=4;
//up until here, we're using the array as a hashtable.

//now we loop through the array - you can't do this with a hashtable:
foreach($idTable as $person=>$id)
    echo 'id: '.$id.' | person: '.$person."\n";

//output: id: 1 | person: Tyler
//        id: 20 | person: Bill
//        id: 4 | person: Marc

ध्यान दें कि विशेष रूप से दूसरे उदाहरण में, प्रत्येक तत्व का क्रम बनाए रखा जाता है (टायलर, बिल मार्क) उस क्रम के आधार पर जिसमें वे सरणी में दर्ज किए गए थे। यह सहयोगी सरणियों और हैशटेबल्स के बीच एक बड़ा अंतर है। एक हैशटेबल अपने पास रखी वस्तुओं के बीच कोई संबंध नहीं रखता है, जबकि एक PHP साहचर्य सरणी करता है (आप एक PHP साहचर्य सरणी को सॉर्ट भी कर सकते हैं)।


3
हम्म, इतनी कम व्याख्या। तो वे ABSOLUTELY एक ही बात कर रहे हैं ?
बख्तियार

2
@ बक वे सामान्य रूप से नहीं हैं, लेकिन वे PHP में हैं, जो डेटा संरचनाओं के साथ थोड़ा तेज और ढीला खेलता है क्योंकि प्रदर्शन पर चिंता कम है
माइकल Mrozek

मैं देखता हूं, लेकिन इस मामले में हैश फ़ंक्शन और सामान के लिए इतने सारे एल्गोरिदम क्यों हैं, अगर हैश फ़ंक्शन = सरणियाँ?
बख्तियार

4
@ मिचेल क्या आप इसे एक नुकसान की तरह लग रहे हैं? यह PHP को अलग बनाता है, लेकिन मुझे लगता है कि यह एक अच्छा अंतर है।

1
@ बख्तियार: आपका आखिरी वाक्य एकदम सही है। आपको हैशटैब के बारे में 'भूलने' की ज़रूरत नहीं है - वास्तव में यह बहुत अच्छा है कि आप पहले से ही हैशटेबल्स को समझ लें, क्योंकि अब आप उस ज्ञान को साहचर्य सरणियों पर लागू कर सकते हैं। मैं अपने उत्तर में कुछ उदाहरण जोड़ रहा हूं ताकि आपके लिए और स्पष्ट हो सके।
कैम

21

php सरणियाँ मूल रूप से हैश टेबल हैं


संपादित करें: आह - मुझे इसे हरा दें :) +1।
कैम

मैं क्या देख रहा था :)
फैजान

10
बिल्कुल नहीं। हैश टेबल को कुछ प्रकार के टकराव समाधान की आवश्यकता होती है, जो php सरणियों के पास नहीं है। उनकी टक्कर संकल्प रणनीति सिर्फ पुराने मूल्य की जगह ले रही है, और परिभाषा के अनुसार एक हैश तालिका नहीं है।
जुआन

4
जहाँ तक मुझे याद है, हैश टेबलों में टकराव का रिज़ॉल्यूशन हैशेड की के लिए होता है , न कि ओरिजिनल की (कैसे काम करता है?) के लिए
इमानुएल ओस्टर

18

एक साहचर्य सरणी और हैश तालिका के बीच का अंतर यह है कि एक साहचर्य सरणी एक डेटा प्रकार है, जबकि एक हैश तालिका एक डेटा कार्यान्वयन है। स्पष्ट रूप से कई वर्तमान प्रोग्रामिंग भाषाओं में साहचर्य सरणी प्रकार बहुत महत्वपूर्ण है: पर्ल, पायथन, पीएचपी, आदि। एक हैश तालिका एक साहचर्य सरणी को लागू करने का मुख्य तरीका है, लेकिन काफी एकमात्र तरीका नहीं है। और साहचर्य सरणियाँ हैश टेबल का मुख्य उपयोग हैं, लेकिन केवल एकमात्र उपयोग नहीं है। तो ऐसा नहीं है कि वे समान हैं, लेकिन यदि आपके पास पहले से ही सहयोगी सरणियां हैं, तो आपको आमतौर पर अंतर के बारे में चिंता नहीं करनी चाहिए।

प्रदर्शन कारणों के लिए, यह जानना महत्वपूर्ण हो सकता है कि आपकी पसंदीदा भाषा में आपके सहयोगी सरणियों को हैश के रूप में लागू किया गया है। और उस कार्यान्वयन की ओवरहेड लागत का कुछ विचार करना महत्वपूर्ण हो सकता है। हैश टेबल धीमी हैं और रैखिक सरणियों की तुलना में अधिक मेमोरी का उपयोग करते हैं जैसा कि आप उन्हें सी में देखते हैं।

पर्ल ने सहयोगी सरणियों को "हैश" कहकर दो अवधारणाओं को एक साथ जोड़ दिया। पर्ल की कई विशेषताओं की तरह, यह काफी गलत नहीं है, लेकिन यह टेढ़ा है।


7

PHP में एक सरणी वास्तव में एक आदेशित मानचित्र है, हैशटेबल नहीं। नक्शे और हैशटेबल के बीच मुख्य अंतर यह है कि विच तत्वों में आदेश को याद करने की अक्षमता को जोड़ा गया है। दूसरी ओर, हैशटेबल्स नक्शे की तुलना में बहुत तेज हैं। मानचित्र से एक तत्व लाने की जटिलता हे (nlogn) और हैशटेबल से O (1) है।


4
"मानचित्र से एक तत्व लाने की जटिलता हे (nlogn)" - यह केवल सच नहीं है। यहां तक ​​कि एक लिंक्डलिस्ट के लिए, दिए गए तत्व को प्राप्त करना केवल ओ (एन) है। En.wikipedia.org/wiki/Hash_table पर संबोधित के रूप में और क्या है, एक साहचर्य सरणी को लागू करने के लिए PHP में उपयोग की गई हैश तालिका में O (1)
StackG

1
जैसा कि स्रोत कोड की जांच के बाद यहां बताया गया है , PHP में साहचर्य सरणियों को हैश टेबल के रूप में लागू किया जाता है, जहां "हैश में संग्रहीत प्रत्येक मूल्य को इससे पहले संग्रहीत मूल्य और उसके बाद संग्रहीत मूल्य" एक लिंक की गई सूची के रूप में " से जोड़ा जाता है। तो यह उस के लिए अतिरिक्त मेमोरी का उपयोग करता है, लेकिन एक कुंजी का उपयोग करके एक निश्चित तत्व तक पहुंचना एक सामान्य हैश तालिका, ओ (1) के समान तेज़ है, धीमा नहीं।
लियोपोल्डो सैंसिएक

2

एक साहचर्य सरणी एक ऐसा सरणी है जहाँ आप एक इंडेक्स द्वारा तत्वों को एक्सेस नहीं करते हैं, लेकिन एक कुंजी द्वारा। यह आंतरिक रूप से कैसे काम करता है कार्यान्वयन विशिष्ट है (कोई नियम नहीं है कि यह कैसे काम करना चाहिए)। एक साहचर्य सारणी हैश टेबल द्वारा कार्यान्वित की जा सकती है (अधिकांश कार्यान्वयन यही करेंगे), लेकिन इसे किसी प्रकार के पेड़ की संरचना या एक स्किप सूची या एल्गोरिदम द्वारा भी लागू किया जा सकता है, जो सरणी में सभी तत्वों पर निर्भर करता है और एक कुंजी की तलाश करता है यह मेल खाता है (यह भयानक रूप से धीमा होगा, लेकिन यह काम करता है)।

हैश टेबल एक तरीका है कि डेटा को कैसे स्टोर किया जाए जहां मान कुंजियों से जुड़े हों और जहां आप लगातार (आमतौर पर लगभग) समय के भीतर कुंजी के लिए मान ढूंढने का इरादा रखते हैं। यह बिलकुल वैसा ही लगता है जैसा आप एक सहयोगी सरणी की अपेक्षा करते हैं, इसीलिए अधिकांश समय हैश टेबल का उपयोग उन सरणियों को लागू करने के लिए किया जाता है, लेकिन यह अनिवार्य नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.