इस फ़ंक्शन O (n ^ 2) के लिए सबसे खराब स्थिति क्यों है?


44

मैं खुद को सिखाने की कोशिश कर रहा हूं कि एक मनमानी फ़ंक्शन के लिए बिगओ नोटेशन की गणना कैसे करें। मुझे यह फ़ंक्शन एक पाठ्यपुस्तक में मिला। पुस्तक दावा करती है कि फ़ंक्शन O (n 2 ) है। यह क्यों है के रूप में एक स्पष्टीकरण देता है, लेकिन मैं पालन करने के लिए संघर्ष कर रहा हूं। मुझे आश्चर्य है कि अगर कोई मुझे गणित दिखाने में सक्षम हो सकता है तो ऐसा क्यों है। मौलिक रूप से, मैं समझता हूं कि यह O (n 3 ) से कुछ कम है , लेकिन मैं स्वतंत्र रूप से O (n 2 ) पर नहीं उतर सकता

मान लीजिए कि हमें संख्याओं के तीन अनुक्रम दिए गए हैं, ए, बी, और सी। हम मानेंगे कि किसी भी व्यक्तिगत अनुक्रम में डुप्लिकेट मान नहीं हैं, लेकिन हो सकता है कि कुछ संख्याएँ दो या तीन अनुक्रमों में हों। तीन-तरफ़ा सेट असंगति समस्या यह निर्धारित करने के लिए है कि तीन अनुक्रमों का प्रतिच्छेदन खाली है, अर्थात्, कोई तत्व x नहीं है जैसे कि x, A, x, B, और x dis C।

संयोग से, यह मेरे लिए एक होमवर्क समस्या नहीं है - कि जहाज वर्षों पहले रवाना हो गया है:), बस मुझे होशियार होने की कोशिश कर रहा है।

def disjoint(A, B, C):
        """Return True if there is no element common to all three lists."""  
        for a in A:
            for b in B:
                if a == b: # only check C if we found match from A and B
                   for c in C:
                       if a == c # (and thus a == b == c)
                           return False # we found a common value
        return True # if we reach this, sets are disjoint

[संपादित करें] पाठ्यपुस्तक के अनुसार:

उन्नत संस्करण में, यह केवल ऐसा नहीं है कि हम भाग्यशाली होने पर समय की बचत करते हैं। हम दावा करते हैं कि असहमति के लिए सबसे खराब समय चल रहा है ओ (एन 2 ) है।

पुस्तक की व्याख्या, जिसे मैं पालन करने के लिए संघर्ष करता हूं, वह है:

समग्र रूप से चलने वाले समय के लिए, हम कोड की प्रत्येक पंक्ति को निष्पादित करने में लगने वाले समय की जांच करते हैं। A से अधिक लूप के प्रबंधन के लिए O (n) समय की आवश्यकता होती है। कुल ओ (एन 2 ) समय के लिए बी खातों पर लूप के लिए प्रबंधन , क्योंकि उस लूप को अलग-अलग समय पर निष्पादित किया जाता है। परीक्षण a == b का मूल्यांकन O (n 2 ) बार किया जाता है। बिताया गया शेष समय इस बात पर निर्भर करता है कि कितने मिलान (ए, बी) जोड़े मौजूद हैं। जैसा कि हमने उल्लेख किया है, ऐसे अधिकांश जोड़े ऐसे हैं, और इसलिए C के ऊपर लूप का प्रबंधन, और उस लूप के शरीर के भीतर कमांड, अधिकांश O (n 2 ) समय पर उपयोग करते हैं । बिताया गया कुल समय O (n 2 ) है।

(और उचित क्रेडिट देने के लिए ...) पुस्तक है: माइकल टी। गुडरिक एट द्वारा पायथन में डेटा संरचनाएं और एल्गोरिदम। सभी, विली प्रकाशन, स्नातकोत्तर। 135

[संपादित करें] एक औचित्य; अनुकूलन से पहले कोड नीचे दिया गया है:

def disjoint1(A, B, C):
    """Return True if there is no element common to all three lists."""
       for a in A:
           for b in B:
               for c in C:
                   if a == b == c:
                        return False # we found a common value
return True # if we reach this, sets are disjoint

उपरोक्त में, आप स्पष्ट रूप से देख सकते हैं कि यह O (n 3 ) है, क्योंकि प्रत्येक लूप को अपने पूरे भाग में चलना चाहिए। पुस्तक यह कहती है कि सरलीकृत उदाहरण (पहले दिए गए) में, तीसरा लूप केवल O (n 2 ) की जटिलता है, इसलिए जटिलता समीकरण k + O (n 2 ) + O (n 2 ) के रूप में जाता है जो अंततः उपज देता है ओ (एन 2 )।

हालांकि मैं यह साबित नहीं कर सकता कि यह मामला है (इस प्रकार प्रश्न), पाठक इस बात से सहमत हो सकता है कि सरलीकृत एल्गोरिथ्म की जटिलता मूल से कम से कम है।

[संपादित करें] और यह साबित करने के लिए कि सरलीकृत संस्करण द्विघात है:

if __name__ == '__main__':
    for c in [100, 200, 300, 400, 500]:
        l1, l2, l3 = get_random(c), get_random(c), get_random(c)
        start = time.time()
        disjoint1(l1, l2, l3)
        print(time.time() - start)
        start = time.time()
        disjoint2(l1, l2, l3)
        print(time.time() - start)

पैदावार:

0.02684807777404785
0.00019478797912597656
0.19134306907653809
0.0007600784301757812
0.6405444145202637
0.0018095970153808594
1.4873297214508057
0.003167390823364258
2.953308343887329
0.004908084869384766

चूंकि दूसरा अंतर बराबर है, सरलीकृत फ़ंक्शन वास्तव में द्विघात है:

यहाँ छवि विवरण दर्ज करें

[संपादित करें] और अभी तक और भी सबूत:

अगर मैं सबसे खराब स्थिति मानता हूं (ए = बी! = सी),

if __name__ == '__main__':
    for c in [10, 20, 30, 40, 50]:
        l1, l2, l3 = range(0, c), range(0,c), range(5*c, 6*c)
        its1 = disjoint1(l1, l2, l3)
        its2 = disjoint2(l1, l2, l3)
        print(f"iterations1 = {its1}")
        print(f"iterations2 = {its2}")
        disjoint2(l1, l2, l3)

पैदावार:

iterations1 = 1000
iterations2 = 100
iterations1 = 8000
iterations2 = 400
iterations1 = 27000
iterations2 = 900
iterations1 = 64000
iterations2 = 1600
iterations1 = 125000
iterations2 = 2500

दूसरे अंतर परीक्षण का उपयोग करना, सबसे खराब स्थिति परिणाम बिल्कुल द्विघात है।

यहाँ छवि विवरण दर्ज करें


6
या तो किताब गलत है या आपका ट्रांसक्रिप्शन है।
कैंडिड_ऑरेंज

6
नहीं। गलत का हवाला दिया है, भले ही इसका हवाला दिया जाए। या तो समझाएं कि हम क्यों नहीं मान सकते कि अगर वे सबसे बड़ा तरीका अपनाते हैं तो वे बड़े ओ विश्लेषण कर सकते हैं या आपको प्राप्त होने वाले परिणामों को स्वीकार कर सकते हैं।
कैंडिड_ऑरेंज

8
@candied_orange; मैंने अपनी क्षमता के अनुसार कुछ और औचित्य जोड़ दिए हैं - मेरा मजबूत सूट नहीं। मैं पूछूंगा कि आप फिर से इस संभावना के लिए अनुमति देते हैं कि आप वास्तव में गलत हो सकते हैं। आपने अपनी बात पूरी कर ली है।
स्टीवजे

8
रैंडम नंबर आपका सबसे खराब मामला नहीं है। जो कुछ भी साबित नहीं करता है।
तेलस्टिन

7
आह। ठीक है। "कोई अनुक्रम में डुप्लिकेट मान नहीं है" सबसे खराब स्थिति को बदलता है क्योंकि सी केवल किसी भी ए के अनुसार एक बार ट्रिगर हो सकता है। निराशा के बारे में क्षमा करें - यही है कि मुझे
स्टैटेक्सचेंज

जवाबों:


63

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

पुस्तक यह तर्क देती है कि जटिलता O (n because) है क्योंकि if a == bशाखा को सबसे अधिक बार n में प्रवेश किया जाता है । यह गैर-स्पष्ट है क्योंकि लूप अभी भी नेस्टेड के रूप में लिखे गए हैं। यदि हम इसे निकालते हैं तो यह अधिक स्पष्ट है:

def disjoint(A, B, C):
  AB = (a
        for a in A
        for b in B
        if a == b)
  ABC = (a
         for a in AB
         for c in C
         if a == c)
  for a in ABC:
    return False
  return True

यह संस्करण मध्यवर्ती परिणामों का प्रतिनिधित्व करने के लिए जनरेटर का उपयोग करता है।

  • जनरेटर में AB, हमारे पास अधिकांश n तत्व होंगे (इस गारंटी के कारण कि इनपुट सूचियों में डुप्लिकेट नहीं होंगे), और जनरेटर का उत्पादन O (n takes) जटिलता लेता है।
  • जनरेटर उत्पादन ABCजनरेटर पर एक लूप शामिल ABलंबाई के एन और अधिक Cलंबाई के एन , ताकि उसके एल्गोरिथम जटिलता है ओ (n²) के रूप में अच्छी तरह से।
  • इन ऑपरेशनों को नस्ट नहीं किया जाता है लेकिन स्वतंत्र रूप से होता है, ताकि कुल जटिलता हे (n² + n²) = O (nested)।

क्योंकि इनपुट सूचियों के जोड़े क्रमिक रूप से जांचे जा सकते हैं, यह इस प्रकार निर्धारित करता है कि क्या किसी भी संख्या की सूची असंतुष्ट है, इसे O (n in) समय में किया जा सकता है।

यह विश्लेषण अभेद्य है क्योंकि यह मानता है कि सभी सूचियों की लंबाई समान है। हम अधिक सटीक रूप से कह सकते हैं कि ABइसकी लंबाई लंबाई न्यूनतम (| A | | B |) है और इसके निर्माण में जटिलता O (| A | • • B) है।) उत्पादन ABCमें जटिलता हे (न्यूनतम | (| A | | | B |) • | C |) | कुल जटिलता तब निर्भर करती है कि इनपुट सूचियों का आदेश कैसे दिया जाता है। साथ | ए | | | बी | | | सी | हमें O (। | A | • | C |) की कुल सबसे खराब स्थिति मिलती है।

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

for a in A:
  if a in B:  # might implicitly loop
    if a in C:  # might implicitly loop
      return False
return True

या जनरेटर आधारित संस्करण में:

AB = (a for a in A if a in B)
ABC = (a for a in AB if a in C)
for a in ABC:
  return False
return True

4
यह इतना स्पष्ट होगा यदि हम इस जादुई nचर को समाप्त कर दें , और नाटक में वास्तविक चर के बारे में बात करें।
अलेक्जेंडर

15
@code_dredd नहीं यह नहीं है, इसका कोड से कोई सीधा संबंध नहीं है। यह एक अमूर्तता है len(a) == len(b) == len(c), जो उस समय की जटिलता के विश्लेषण के संदर्भ में सच है , जो वार्तालाप को भ्रमित करने के लिए जाता है।
अलेक्जेंडर

10
शायद यह कहते हुए कि ओपी के कोड में सबसे खराब स्थिति है ओ (| A | • | B | + मिनट | (A | | | | | | B |) • • - C) समझ को ट्रिगर करने के लिए पर्याप्त है
पाब्लो एच।

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

4
"ध्यान दें कि टाइमिंग एल्गोरिथम जटिलता का एक उपयोगी संकेतक नहीं है।" मुझे लगता है कि यह अधिक सटीक होगा यदि यह "उपयोगी" के बजाय "कठोर" या "विश्वसनीय" कहा जाए।
संचय

7

ध्यान दें कि यदि सभी तत्वों को ग्रहण की गई सूची में से प्रत्येक में अलग-अलग हैं, तो आप ए में प्रत्येक तत्व के लिए केवल एक बार सी टाइप कर सकते हैं (यदि बी में तत्व है जो बराबर है)। तो आंतरिक लूप O (n ^ 2) कुल है


3

हम मान लेंगे कि किसी भी व्यक्तिगत अनुक्रम में डुप्लिकेट नहीं है।

बहुत महत्वपूर्ण जानकारी है।

अन्यथा, अनुकूलित संस्करण का सबसे खराब मामला तब भी O (n,) होगा, जब A और B बराबर होते हैं और एक तत्व डुप्लिकेट n होता है:

i = 0
def disjoint(A, B, C):
    global i
    for a in A:
        for b in B:
            if a == b:
                for c in C:
                    i+=1
                    print(i)
                    if a == c:
                        return False 
    return True 

print(disjoint([1] * 10, [1] * 10, [2] * 10))

कौन से आउटपुट:

...
...
...
993
994
995
996
997
998
999
1000
True

इसलिए मूल रूप से, लेखक यह मानते हैं कि O (n,) सबसे खराब स्थिति नहीं होनी चाहिए (क्यों?), और "साबित" कि सबसे खराब स्थिति अब O (n²) है।

असली अनुकूलन ओ (1) में समावेश का परीक्षण करने के लिए सेट या डिकेट का उपयोग करना होगा। उस स्थिति में, disjointहर इनपुट के लिए O (n) होगा।


आपकी अंतिम टिप्पणी काफी दिलचस्प है, ऐसा नहीं सोचा था। क्या आप सुझाव दे रहे हैं कि आपके द्वारा श्रृंखला में तीन O (n) संचालन करने में सक्षम होने के कारण है?
स्टीवजे

2
जब तक आपको इनपुट तत्व में कम से कम एक बाल्टी के साथ एक परिपूर्ण हैश नहीं मिल जाता है जिसे आप O (1) में शामिल नहीं कर सकते। सॉर्ट किए गए सेट में आमतौर पर O (लॉग एन) लुकअप होता है। जब तक आप औसत लागत के बारे में बात नहीं कर रहे हैं, लेकिन यह सवाल क्या है के बारे में नहीं है। फिर भी, एक संतुलित बाइनरी सेट प्राप्त करना मुश्किल ओ (एन लॉग एन) तुच्छ है।
Jan Dorniak

@JanDorniak: उत्कृष्ट टिप्पणी, धन्यवाद। अब यह थोड़ा अजीब है: मैंने सबसे खराब स्थिति को नजरअंदाज कर दिया key in dict, जैसे लेखकों ने किया। : - / मेरे बचाव में, मुझे लगता है कि केवल डुप्लिकेट किए गए मानों के साथ एक सूची बनाने की तुलना में nचाबियाँ और nहैश टकराव के साथ एक तानाशाह को ढूंढना बहुत कठिन है n। और एक सेट या तानाशाही के साथ, वास्तव में कोई भी डुप्लिकेट मान नहीं हो सकता है। तो सबसे खराब-सबसे-मामला वास्तव में हे (n।) है। मैं अपना जवाब अपडेट करूंगा।
एरिक डुमिनील

2
@JanDorniak मुझे लगता है कि सेट और डाइक Cth में लाल-काले पेड़ों के विपरीत अजगर में हैश टेबल हैं। तो पूर्णतः सबसे खराब स्थिति एक खोज के लिए 0 (n) तक बदतर है, लेकिन औसत मामला O (1) है। C ++ के लिए O (log n) के विपरीत wiki.python.org/moin/TimeComplexity । यह देखते हुए कि यह एक अजगर सवाल है, और यह कि समस्या का डोमेन औसत मामले के प्रदर्शन की एक उच्च संभावना की ओर जाता है, मुझे नहीं लगता कि ओ (1) का दावा एक खराब है।
बाल्ड्रिक

3
मुझे लगता है कि मैं इस मुद्दे को यहां देखता हूं: जब लेखक कहते हैं "हम मान लेंगे कि किसी भी व्यक्तिगत अनुक्रम में डुप्लिकेट मान शामिल नहीं हैं", जो प्रश्न का उत्तर देने में एक कदम नहीं है; यह, बल्कि, एक पूर्व शर्त है जिसके तहत प्रश्न को संबोधित किया जाने वाला है। शैक्षणिक उद्देश्यों के लिए, यह एक बड़ी समस्या को बदल देता है, जो लोगों को बड़े-ओ के बारे में अंतर्ज्ञान को चुनौती देता है - और यह उस पर सफल हुआ लगता है, उन लोगों की संख्या को देखते हुए जिन्होंने जोर देकर कहा है कि हे (n () गलत होना चाहिए। .. इसके अलावा, जबकि यह यहां मूट है, एक उदाहरण में चरणों की संख्या की गणना करना एक स्पष्टीकरण नहीं है।
श्रीधाम

3

उन चीजों को शब्दों में ढालने के लिए जिनका उपयोग आपकी पुस्तक करती है:

मुझे लगता है कि आपको यह समझने में कोई समस्या नहीं है कि चेक a == bसबसे खराब स्थिति में है O (n 2 )।

अब तीसरे लूप के लिए सबसे खराब स्थिति aमें , हर Aमैच में है B, इसलिए हर बार तीसरे लूप को बुलाया जाएगा। ऐसे मामले में जहां aअस्तित्व में नहीं है C, यह पूरे Cसेट के माध्यम से चलेगा ।

दूसरे शब्दों में, यह प्रत्येक के लिए a1 बार और प्रत्येक c, या n * n के लिए 1 समय है । ओ (एन 2 )

तो वहाँ O (n 2 ) + O (n 2 ) है जो आपकी पुस्तक को इंगित करता है।


0

अनुकूलित विधि की चाल कोनों को काटने के लिए है। केवल a और b मैच होने पर c को एक लुक दिया जाएगा। अब आप समझ सकते हैं कि सबसे खराब स्थिति में आपको अभी भी प्रत्येक ग का मूल्यांकन करना होगा। यह सच नहीं है।

आपको शायद लगता है कि सबसे खराब स्थिति यह है कि सी पर एक रन = = b के परिणाम के लिए हर चेक क्योंकि a == b के लिए हर चेक एक मैच देता है। लेकिन यह संभव नहीं है क्योंकि इसके लिए स्थितियां विरोधाभासी हैं। इसके लिए काम करने के लिए आपको A और B की आवश्यकता होगी जिसमें समान मान हों। उन्हें अलग-अलग आदेश दिया जा सकता है, लेकिन ए में प्रत्येक मूल्य का बी में मिलान मूल्य होना चाहिए।

अब यहाँ किकर है। इन मूल्यों को व्यवस्थित करने का कोई तरीका नहीं है ताकि प्रत्येक के लिए आपको अपना मैच खोजने से पहले सभी बी का मूल्यांकन करना पड़े।

A: 1 2 3 4 5
B: 1 2 3 4 5

यह तुरन्त किया जाएगा क्योंकि मिलान 1 दोनों श्रृंखलाओं में पहला तत्व है। व्हाट अबाउट

A: 1 2 3 4 5
B: 5 4 3 2 1

यह ए पर पहले रन के लिए काम करेगा: बी में केवल अंतिम तत्व एक हिट प्राप्त करेगा। लेकिन A पर अगला पुनरावृति पहले से ही तेज होना होगा क्योंकि B में अंतिम स्थान पर पहले से ही 1 का कब्जा है। और वास्तव में इस बार केवल चार पुनरावृत्तियों को लिया जाएगा। और यह हर अगले चलना के साथ थोड़ा बेहतर हो जाता है।

अब मैं कोई गणितज्ञ नहीं हूं, इसलिए मैं इस बात का सबूत नहीं दे सकता कि यह ओ (एन 2) में खत्म हो जाएगा, लेकिन मैं इसे अपने मोज़री पर महसूस कर सकता हूं।


1
तत्वों का क्रम यहाँ एक भूमिका नहीं निभाता है। महत्वपूर्ण आवश्यकता यह है कि कोई डुप्लिकेट नहीं है; तब तर्क यह है कि छोरों को दो अलग-अलग O(n^2)छोरों में बदला जा सकता है; जो समग्र देता है O(n^2)(स्थिरांक को अनदेखा किया जाता है)।
AnoE

@ कोई बात नहीं, तत्वों का क्रम मायने नहीं रखता। ठीक यही मैं प्रदर्शित कर रहा हूं।
मार्टिन मैत

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

-1

पहली बार में चकरा गया था, लेकिन अमोन का जवाब वास्तव में मददगार है। मैं देखना चाहता हूं कि क्या मैं वास्तव में संक्षिप्त संस्करण कर सकता हूं:

की दी गई मूल्य के लिए aमें A, समारोह तुलना aहर संभव साथ bमें B, और यह केवल एक बार होता है। तो किसी दिए के लिए aयह a == bठीक nसमय पर प्रदर्शन करता है ।

Bइसलिये दिये गये किसी भी डुप्लिकेट शामिल नहीं है (सूचियों में से कोई भी नहीं है), aवहाँ हो जाएगा पर सबसे एक मैच। (यह कुंजी है)। जहां एक मैच होता है, aउसकी तुलना हर संभव के साथ की जाएगी c, जिसका अर्थ है कि a == cबिल्कुल n बार किया जाता है। जहाँ कोई मेल a == cनहीं है , वहाँ बिल्कुल नहीं होता है।

तो किसी दिए गए के लिए , या aतो nतुलनाएं हैं, या 2nतुलनाएं हैं। यह प्रत्येक के लिए होता है a, इसलिए सबसे अच्छा संभव मामला है (n and) और सबसे खराब (2n every) है।

TLDR: के हर मूल्य की aहर मूल्य के bखिलाफ और के हर मूल्य के खिलाफ तुलना की जाती है c, लेकिन और के हर संयोजन के खिलाफ नहीं है । दोनों मुद्दों को एक साथ जोड़ते हैं, लेकिन वे गुणा नहीं करते हैं।bc


-3

इसके बारे में इस तरह से सोचें, कुछ संख्याएँ दो या तीन क्रमों में हो सकती हैं लेकिन इसका औसत मामला यह है कि सेट A में प्रत्येक तत्व के लिए, एक संपूर्ण खोज b में की जाती है। यह गारंटी दी जाती है कि सेट A में मौजूद प्रत्येक तत्व को इससे अधिक पुनरावृत्त किया जाएगा, लेकिन यह निहित है कि सेट b में मौजूद तत्वों में से आधे से कम का पुनरावृत्त किया जाएगा।

जब सेट बी में तत्वों को पुनरावृत्त किया जाता है, तो एक मिलान होने पर एक पुनरावृत्ति होती है। इसका अर्थ है कि इस डिसऑर्डर फ़ंक्शन का औसत मामला O (n2) है, लेकिन इसके लिए सबसे खराब मामला O (n3) हो सकता है। यदि पुस्तक विस्तार में नहीं जाती है, तो संभवतः यह आपको उत्तर के रूप में औसत मामला देगा।


4
पुस्तक काफी स्पष्ट है कि ओ (एन 2) सबसे खराब मामला है, औसत मामला नहीं।
स्टीवजे

बड़े ओ संकेतन के संदर्भ में एक फ़ंक्शन का विवरण आमतौर पर केवल फ़ंक्शन की वृद्धि दर पर एक ऊपरी बाध्य प्रदान करता है। बड़े ओ नोटेशन के साथ जुड़े कई संबंधित संकेतन हैं, एसिम्प्टोटिक विकास दर पर अन्य प्रकार की सीमाओं का वर्णन करने के लिए प्रतीकों ओ, ω, not, और not का उपयोग करते हैं। विकिपीडिया - बिग ओ
कैंडिड_ऑरेंज

5
"यदि पुस्तक विस्तार में नहीं गई, तो शायद यह आपको उत्तर के रूप में औसत मामला देगा।" - उम्म, नहीं। किसी भी स्पष्ट योग्यता के बिना, हम आमतौर पर रैम मॉडल में सबसे खराब स्थिति वाले कदम जटिलता के बारे में बात कर रहे हैं । जब डेटा संरचनाओं पर कार्रवाई के बारे में बात है, और यह संदर्भ से स्पष्ट है, तो हम हो सकता है बात कर के बारे में परिशोधित रैम मॉडल में बुरी से बुरी हालत कदम जटिलता। स्पष्ट योग्यता के बिना , हम आम तौर पर सबसे अच्छे मामले, औसत मामले, अपेक्षित मामले, समय की जटिलता या रैम को छोड़कर किसी अन्य मॉडल के बारे में बात नहीं करेंगे ।
जॉर्ग डब्ल्यू मित्तग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.