(कब) हैश टेबल लुकिंग O (1) है?


70

यह अक्सर कहा जाता है कि हैश टेबल लुकअप निरंतर समय में संचालित होता है: आप हैश मान की गणना करते हैं, जो आपको सरणी लुकअप के लिए एक इंडेक्स देता है। फिर भी यह टकरावों की अनदेखी करता है; सबसे खराब स्थिति में, प्रत्येक वस्तु एक ही बाल्टी में उतरने के लिए होती है और देखने का समय रैखिक ( ) हो जाता है ।Θ(n)

क्या डेटा पर ऐसी स्थितियाँ हैं जो हैश टेबल लुकिंग को वास्तव में ? क्या यह केवल औसत पर है, या हैश तालिका में ओ ( 1 ) सबसे खराब स्थिति हो सकती है?O(1)O(1)

नोट: मैं एक प्रोग्रामर के दृष्टिकोण से यहां आ रहा हूं; जब मैं एक हैश तालिका में डेटा संग्रहीत करता हूं, तो यह लगभग हमेशा तार या कुछ समग्र डेटा संरचनाएं होती हैं, और डेटा हैश तालिका के जीवनकाल के दौरान बदल जाता है। इसलिए जब मैं परफेक्ट हैश के बारे में जवाब की सराहना करता हूं, तो वे मेरी बात से प्यारे लेकिन किस्से और व्यावहारिक नहीं होते।

PS अनुवर्ती: किस प्रकार के डेटा के लिए हैश तालिका संचालन O (1) हैं?


3
क्या आप परिशोधित एक्सेस टाइम के साथ रह सकते हैं ? सामान्य तौर पर, हैश टेबल का प्रदर्शन बहुत हद तक इस बात पर निर्भर करता है कि आपके द्वारा सहन करने के लिए तैयार किए गए विरल हैशटेबल्स के लिए ओवरहेड और वास्तविक हैश मूल्यों को कैसे वितरित किया जाता है। O(1)
— राफेल

5
ओह, btw: आप सूची के बजाय (संतुलित) खोज पेड़ों का उपयोग करके रैखिक सबसे खराब व्यवहार से बच सकते हैं।
— राफेल

1
@ राफेल मुझे एक ऐसे उत्तर में बहुत दिलचस्पी होगी जो बताता है कि (व्यापक लाइनों के साथ) जब मैं पर भरोसा कर सकता हूं और जब मैं नहीं कर सकता। कैसे हैश मूल्यों को वितरित किया जाता है, यह वास्तव में मेरे प्रश्न का हिस्सा है: मैं कैसे जान सकता हूं? मुझे पता है कि हैश फ़ंक्शन मानों को अच्छी तरह से वितरित करने वाले हैं; लेकिन अगर वे हमेशा सबसे खराब स्थिति में पहुंचते हैं, तो कभी नहीं पहुंचेंगे, जिसका कोई मतलब नहीं है। O(1)
— गाइल्स

1
समयपूर्व अनुकूलन से भी सावधान रहें; छोटे (कई हजार तत्वों) डेटा के लिए मैंने अक्सर संतुलित द्विआधारी पेड़ों के बहिर्वाह हैशटैब को कम ओवरहेड के कारण देखा है (स्ट्रिंग की तुलना में स्ट्रिंग हैश की तुलना में काफी सस्ता है)। O(log⁡n)
— isturdy

जवाबों:


41

दो सेटिंग्स हैं जिनके तहत आप सबसे खराब स्थिति में प्राप्त कर सकते हैं ।O(1)

  1. यदि आपका सेटअप स्थिर है, तो FKS हैशिंग आपको सबसे खराब स्थिति वाला गारंटी प्रदान करेगी । लेकिन जैसा कि आपने संकेत दिया, आपकी सेटिंग स्थिर नहीं है।O(1)

  2. यदि आप कोयल हैशिंग का उपयोग करते हैं, तो प्रश्न और विलोपन सबसे खराब स्थिति है, लेकिन प्रविष्टि केवल O ( 1 ) अपेक्षित है। कोयल हैशिंग काफी अच्छा काम करती है यदि आपके पास आवेषण की कुल संख्या पर ऊपरी सीमा है, और तालिका का आकार लगभग 25% बड़ा है।O(1)O(1)

यहाँ अधिक जानकारी है ।


3
क्या आप एफकेएस और कोयल पर विस्तार कर सकते हैं? मेरे लिए दोनों शर्तें नई हैं।
— गाइल्स

1
गतिशील परिपूर्ण हैशिंग के बारे में क्या? इसमें सबसे खराब स्थिति वाला लुक और O ( 1 ) एमॉर्टाइज़्ड इंसर्शन और डिलीशन है। ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.30.8165 )O(1)O(1)
— जो

2
एफकेएस (फ्रेडमैन, कोलोम्स, स्जेमेरीडी) के प्रारंभिक नाम हैं और कोयल एक ब्रिड प्रजाति का नाम है। इसका उपयोग इस प्रकार के हैशिंग के लिए किया जाता है, क्योंकि कोयल की चूचियाँ घोंसले से अंडे को बाहर निकाल देती हैं। यह कुछ हद तक यह कैसे काम करता है विधि जैसा दिखता है।
— औली

1
@ सुरेश: सच? मुझे लगा कि आपको निर्भरता कार्यों की आवश्यकता है, जिसे मैं हमेशा विस्तारक के साथ जुड़ा हुआ हूं। मुझे सही साबित होना है। मेरी टिप्पणी को थोड़ा हटा देंगे। log⁡n
— लुइस

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

21

यह उत्तर TAoCP Vol 3, Ch 6.4 के कुछ हिस्सों को संक्षेप में प्रस्तुत करता है ।

मान लें कि हम मूल्यों का एक सेट है , एन जिनमें से हम एक सरणी में संग्रहीत करना चाहते हैं एक आकार के मीटर । हम एक हैश फ़ंक्शन h : V → [ 0 .. M ) नियोजित करते हैं ; आम तौर पर, एम ≪ | वी | । हम α = n कहते हैंVnAmh:V→[0..M)M≪|V| लोड फैक्टरकेएक। यहां, हम प्राकृतिकm=Mमान लेंगे; व्यावहारिक स्थितियों में, हममीटर«एम, हालांकि, और करने के लिए नीचे मैप करने के लिए हैमीटरखुद।α=nmAm=Mm≪Mm

hO(1)

[0..M)CnSCnU

चेनिंग

nm

CnS≈1+α2 and CnU≈1+α22.

रैखिक जांच

v

h(v),h(v)−1,…,0,m−1,…,h(v)+1
vα→1
CnS≈12(1+11−α) and CnU≈12(1+(11−α)2).
α<0.75

डबल हैशिंग

M

CnS≈1αln⁡(11−α) and CnU≈11−α.

ध्यान दें कि तालिकाओं से तत्वों को निकालने और संबंधित विधियों के लिए अलग-अलग कठिनाई की डिग्री है।

O(1)αh


h
Hashtable


10

S{0,1,2,...,n}O(1)O(1)lSlxx∈SO(|l|)SO(|S|)O(|l|+|S|)O(|l||S|)O(log⁡(|l|)|S|)O(|l|)l

O(|l|)

lU⊂NS⊆Ux∈Sllh:U→{true,false}hh(x)=falsex∈Uylh(y)=trueO(|l|)O(|U|)

lO(|U|)O(|1|)O(|U|)

Uh


O(|l|)O(|S|)O(|l|⋅|S|)

hh:U→{false,true}h

@Gilles यह मूल रूप से सिर्फ सूची सदस्यता के लुकअप टेबल के रूप में इस्तेमाल किया जा रहा है। जब आपके पास एक ज्ञात और सस्ते व्युत्क्रम के साथ एक सही हैश फ़ंक्शन होता है, तो चीज़ को स्वयं संग्रहीत करने के बजाय, आपको केवल 1 बिट स्टोर करने की आवश्यकता होती है (चाहे अद्वितीय हैश के साथ चीज़ को जोड़ा गया हो)। यदि टकराव संभव है, तो मुझे लगता है कि ऐसा करने को ब्लूम फ़िल्टर के रूप में संदर्भित किया जाता है, लेकिन किसी भी घटना में सदस्यता के प्रश्न के लिए एक निश्चित "नहीं" प्रदान कर सकता है, जो अभी भी कई परिदृश्यों में उपयोगी है।
— पैट्रिक87

9

O(1)

O(1)O(1)O(1)O(1)


एक सही हैश फ़ंक्शन सही होगा, लेकिन मुझे एक कैसे मिलेगा? इसकी कितनी लागत आएगी? और मुझे कैसे पता चलेगा कि टकराव की अधिकतम या अपेक्षित संख्या क्या है?
— गाइल्स

2
@Gilles एक परफेक्ट हैश फंक्शन किसी भी फंक्शन है जो सभी संभावित इनपुट्स के लिए एक अद्वितीय हैश का उत्पादन करेगा। यदि आपके संभावित इनपुट्स परिमित (और अद्वितीय) हैं, तो यह करना आसान है।
— राफे केटलर

1
@RafeKettler मेरे इनपुट आम तौर पर स्ट्रिंग्स या कंपाउंड डेटा स्ट्रक्चर्स हैं, और मैं आमतौर पर एंट्रीज को जोड़ और हटा देता हूं क्योंकि मेरा डेटा विकसित होता है। मैं इसके लिए एक आदर्श हैश कैसे बनाऊं?
— गाइल्स

4
हाँ, लेकिन यह बात है। यदि डोमेन सीमा से बड़ा है, तो एक नियतकालिक सही हैश फ़ंक्शन मौजूद नहीं है।
— सुरेश

@ सुरेश: यदि आपको कोई नया हैश फ़ंक्शन चुनने की अनुमति दी जाती है और जब भी कोई टक्कर होती है तो टेबल का आकार बढ़ाते हैं, तो आप हमेशा एक (निर्धारक) हैश फ़ंक्शन पा सकते हैं - तालिका में पहले से मौजूद डेटा के लिए और एक नया आइटम जिसे आप सम्मिलित करने का प्रयास कर रहे हैं - कोई टक्कर नहीं है ("सही" है)। यही कारण है कि गतिशील परिपूर्ण हैशिंग समय-समय पर एक यादृच्छिक नए हैश फ़ंक्शन को चुनता है।
— डेविड कैरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.