2010-07-21 17 views
15

मैं एक दावा में भाग गया कि हैशसेट < टी >।() एक ओ (1) ऑपरेशन है। इसने मुझे आश्चर्यचकित कर दिया क्योंकि मैंने सामना करने वाली हर चर्चा के बारे में टकराव की संभावना का उल्लेख किया है, संभावित रूप से ओ (एन) रन टाइम की ओर अग्रसर है।ओ (1) हैश लुक अप?

उत्सुक होने के कारण, मैंने हैशसेट < टी > के लिए प्रलेखन में देखा। इसमें शामिल हैं और हैशटेबल भी शामिल हैं। दोनों विधियों के लिए प्रलेखन एक ही दावा करते हैं।

जब मैं परावर्तक में देखता हूं, हैशसेट < टी >।() को लूप के साथ कार्यान्वित किया जाता है, जिसमें स्लॉट्स की एक सूची होती है जिसमें वे हैंश होते हैं।

अब स्वीकार्य रूप से, हैशिंग के उन विचार-विमर्शों ने यह भी उल्लेख किया है कि एक अच्छा हैशिंग एल्गोरिदम टकराव से बचाता है और उन परिस्थितियों में लुकअप वास्तव में ओ (1) होगा। लेकिन बिग ओ नोटेशन की मेरी समझ यह है कि यह सबसे खराब मामला रनटाइम समय है, सर्वोत्तम नहीं।

तो क्या ओ (1) दावा गलत है? या क्या मैं कुछ न कुछ भूल रहा हूं?

+2

मुझे बड़े ओ नोटेशन से नफरत है =] – Luiscencio

+2

@ लुइसेंसिओ बिग ओ नोटेशन केवल वे शब्द हैं जो आपको एक और प्रोग्रामर बताते हैं कि एक फ़ंक्शन कैसे स्केल करेगा। आप कौन से शब्दों का सुझाव देते हैं जो जल्दी से एक और प्रोग्रामर को अर्ध-सटीक विचार देगा कि दिए गए फ़ंक्शन स्केल कितने अच्छे हैं? –

+2

[मजाक] आपके "कार्यों के बारे में क्या है f ***** जी f ***** जी प्रोसेसर खाने" – Luiscencio

उत्तर

9

लेकिन बिग ओ नोटेशन की मेरी समझ यह है कि यह सबसे खराब मामला रनटाइम समय है, सर्वोत्तम नहीं।

दुर्भाग्य से, एल्गोरिदम का वर्णन करते समय बिग-ओ के लिए कोई "मानक" नहीं है। अक्सर, इसका उपयोग सामान्य या औसत मामले का वर्णन करने के लिए किया जाता है - सबसे खराब मामला नहीं।

Wikipedia से

:

... इस अंकन अब अक्सर भी एल्गोरिदम के विश्लेषण में कम्प्यूटेशनल संसाधनों की एक एल्गोरिथ्म के उपयोग के लिए प्रयोग किया जाता है: सबसे खराब स्थिति या औसत मामला ...

इस मामले में, यह उचित हैशिंग के मानक मानक का वर्णन कर रहा है। यदि आपके पास उचित हैशिंग है, तो सीमित व्यवहार आकार एन के लिए स्थिर रहेगा, इसलिए ओ (1)।

+4

हाँ। एक और प्रमुख उदाहरण क्विक्सोर्ट - ओ (एन^2) सबसे खराब मामला है, लेकिन अक्सर ओ (एन लॉग एन) माना जाता है क्योंकि यह औसत जटिलता है। – kennytm

+0

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

+0

यह आश्चर्य की बात है कि, मुझे सबसे अधिक मामला अधिक सामान्य उपयोग होने की उम्मीद थी, हालांकि (विशेष रूप से हैशिंग) में सबसे बुरी स्थिति आने के कारण अक्सर बेहतर एल्गोरिदम देखने की प्रेरणा होगी। मैं निश्चित रूप से देख सकता हूं कि सामान्य/औसत मामला हालांकि उपयोगी होगा। हैशिंग के मामले में, मैं ओ (1) ज्यादातर समय की अपेक्षा करता हूं। – ThatBlairGuy

7

सामान्य में, यह ओ (1) है।

+0

यहां तक ​​कि ज्ञात खराब प्रदर्शन पर विचार करने पर भी निर्मित 'GetHashCode'? मैं ओ (1) पर निर्भर नहीं होगा ... –

+2

@ स्टीफन: आप किसके बारे में बात कर रहे हैं? इसके अलावा, भले ही 'GetHashCode' को वापस आने में एक घंटा लगते हैं, फिर भी यह ओ (1) है -' GetHashCode' का प्रदर्शन सेट के आकार के साथ स्केल नहीं करता है। – SLaks

+0

@ एसएलएक्स, मुझे लगता है कि स्टीफन हैशिंग के लिए डिफ़ॉल्ट कार्यान्वयन की खराब उपयुक्तता का जिक्र कर रहा था। Http://stackoverflow.com/questions/720177/default-implementation-for-object-gethashcode/720196#720196 –

5

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

2

मेरा मानना ​​है कि इसका औसत औसतन (1) है।

0

बिग ओह की मेरी समझ यह है कि "सबसे खराब मामला" आमतौर पर शामिल तत्वों की संख्या के संदर्भ में होता है। तो यदि कोई कार्य 10 तत्वों के साथ ओ (एन) निष्पादित करना था, लेकिन ओ (एन वर्ग) 100 या उससे अधिक के साथ (सुनिश्चित नहीं है कि ऐसा एल्गोरिदम वास्तव में मौजूद है), तो एल्गोरिदम को ओ (एन वर्ग) माना जाता है।

0

ओ (1) का मतलब "सबसे खराब मामला" नहीं है। हैश के लिए, आमतौर पर कहता है कि "अपेक्षित" लुकअप समय ओ (1) है, क्योंकि हैश टकराव की संभावना कम है।

+0

यह मुझे आश्चर्यचकित करता है - मैंने देखा कि विभिन्न स्थानों में वाक्यांशों को देखने के संदर्भ में "अपेक्षित" या "सामान्य" नहीं कहा गया था। उन्होंने कहा "है," जो हमेशा का तात्पर्य है। – ThatBlairGuy

6

एक उचित ढंग से लागू हैश तालिका के लिए, देखो अप amortized निरंतर समय जटिलता है।

प्रैक्टिस में, टकराव के मामले में एक एकल रूप ओ (एन) हो सकता है, जैसा कि आप कहते हैं। हालांकि, यदि आप बड़ी संख्या में लुकअप करते हैं तो प्रति ऑपरेशन औसत समय जटिलता निरंतर है।

का हवाला देते हुए विकिपीडिया:

परिशोधित विश्लेषण से कि संभावना में औसत दर-मामला प्रदर्शन शामिल नहीं है अलग है, अमूर्त विश्लेषण सबसे खराब मामले प्रदर्शन पर प्रति ऑपरेशन के समय की गारंटी देता है।

विधि को ज्ञान की आवश्यकता है कि कौन सी श्रृंखला संचालन संभव है। डेटा संरचनाओं के साथ यह आमतौर पर मामला है, जिसमें राज्य है जो संचालन के बीच बनी रहती है। मूल विचार यह है कि एक सबसे खराब केस ऑपरेशन राज्य को इस तरह से बदल सकता है कि सबसे खराब मामला लंबे समय तक फिर से नहीं हो सकता है, इस प्रकार इसकी लागत "अमूर्त" हो जाती है।

+1

+1, अंत में सभी महत्वपूर्ण शब्द "amortized"। –

+0

दरअसल, हैश टेबल जटिलता के अच्छे विवरण में अमूर्त जटिलता का उल्लेख किया जाना चाहिए। लेकिन ध्यान दें कि अमूर्त ओ (1) जटिलता को एक धारणा की आवश्यकता है कि चाबियां पर्याप्त रूप से बेतरतीब ढंग से वितरित की जाती हैं। यदि कोई हमलावर हैश में जोड़ने के लिए चाबियाँ चुनता है, तो वह हर बार टकराव को मजबूर कर सकता है। यह एक क्रिप्टोग्राफिक हैश का उपयोग करके टाला जा सकता है, लेकिन ये बहुत महंगा हैं, इसलिए आपको निषिद्ध रूप से बड़े स्थिरता के साथ निरंतर समय मिल जाएगा। एक और तरीका हैश में एक यादृच्छिक बीज शामिल करना है (पर्ल ने कुछ बिंदु पर किया)। – Gilles

1

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

हां, एक अच्छा हैश फ़ंक्शन टकराव की संभावना को कम कर देता है। एक खराब हैश फ़ंक्शन क्लस्टरिंग प्रभाव का कारण बन सकता है (जहां अलग-अलग मान सटीक समान मान या उसी मान के करीब हैं)। यह प्रदर्शित करना आसान है कि HashSet वास्तव में GetHashCode फ़ंक्शन को इस तरह से कार्यान्वित करके ओ (एन) बन सकता है कि यह हर समय एक ही मूल्य देता है।

एक पोषक तत्व में, हाँ HashSet और Dictionary को ओ (1) रनटाइम जटिलता के रूप में वर्णित किया जा सकता है क्योंकि औसत-मामले परिदृश्य पर जोर दिया जाता है।

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

0

हैश तालिकाओं में न केवल औसत-केस प्रदर्शन ओ (1) है, लेकिन यदि हैश फ़ंक्शन यादृच्छिक है, तो किसी दिए गए प्रतिशत के लिए पी < 100%, प्रदर्शन जिसे प्राप्त किया जा सकता है, ठीक से- डिजाइन हैश कहानी ओ (1) है। यद्यपि चरम परजीवी मामले एन बढ़ने के रूप में अधिक से अधिक गंभीर हो जाते हैं, यह इस तथ्य से संतुलित है कि मामूली-परजीवी मामलों में भी कम और कम संभावना होती है।

संबंधित मुद्दे