5

पूर्णांकों की एक सरणी को देखते हुए, एक तरीका है जिसके सभी अद्वितीय जोड़े जो 100मेरे कोड की बिग-ओ जटिलता क्या है?

उदाहरण डेटा को जोड़ देता है लिखें:

sample_data = [0, 1, 100, 99, 0, 10, 90, 30, 55, 33, 55, 75, 50, 51, 49, 50, 51, 49, 51] 
sample_output = [[1,99], [0,100], [10,90], [51,49], [50,50]] 

मैं इस सप्ताह के अंत में इस समस्या को हल करने गया था और मेरे समाधान स्केलेबल लगता है, जबकि और कुशल, मैं यह निर्धारित करना चाहता था कि मेरे समाधान का सबसे खराब मामला जटिलता क्या है?

यहाँ मेरी समाधान है:

def solution(arr) 
    res = [] 
    h = Hash.new 

    # this seems to be O(N) 
    arr.each do |elem| 
    h[elem] = true 
    end 

    # how do I determine what Time complexity of this could be? 
    arr.each do |elem| 
    if h[100-elem] 
     h[100-elem] = false 
     h[elem] = false 
     res << [elem, 100-elem] 
    end 
    end 
    res 
end 

दोनों छोरों हे (एन) प्रत्येक कर रहे हैं, और मैं उन्हें जोड़ने के ऊपर: हे (एन + N), इस ओ (2N) के बराबर होता है और 2 लेने एक स्थिर होने के लिए, क्या मैं अपना समाधान मान सकता हूं ओ (एन) है?

+3

यह सही होगा। – screenmutt

+0

मुझे लगता है कि आपकी धारणा मूल रूप से सही हैं। यह भी माना जाता है कि तत्व अर्थपूर्ण होने के लिए नकारात्मक (और 100 से अधिक) हो सकते हैं - अन्यथा प्रारंभिक इनपुट को केवल डुप्लिकेट करने से कोई स्केलिंग लागत हो जाती है और सभी चीजों को भरने के बाद अन्य सभी चीज़ों को निश्चित लागत के रूप में माना जा सकता है। 100। तकनीकी रूप से 'एच [elem] = true' 'ओ (1)' नहीं है (जो कि बहुत से लोग मानते हैं) लेकिन' ओ (लॉग (एन)) 'तो आपकी समग्र जटिलता शायद' ओ (नलॉग (एन)) 'सबसे खराब मामला - आप केवल यह देखते हैं कि यदि आप लाखों पूर्णांक के साथ सरणी में पंप हो गए हैं, हालांकि –

+1

@NeilSlater आप गलत हैं। 'h' एक हैश नक्शा है जो खोज रैखिक समय है। [विकी] (http://en.wikipedia.org/wiki/Hash_table) – screenmutt

उत्तर

4

आप सही हैं। यदि आप हैश खोज/डालने के अमूर्त रनटाइम पर विचार करते हैं तो इस कोड का बिग-ओ O(n) होगा।

यदि आप हैश खोज/सम्मिलन (O(n)) का सही-सबसे खराब मामला लेते हैं, तो यह O(n^2) होगा।

See Wikipedia on Hash Tables

0

सवाल हैश के समय जटिलता के बारे में पूछ सकता है, लेकिन विशेष रूप से समस्या के लिए, कि हैश बेहतर इस मामले में इनपुट 0..sum (100 द्वारा अनुक्रमित bools की एक सरणी के रूप में लागू होगा)। उसमें सबसे अच्छा, सबसे खराब और औसत मामला निरंतर समय होगा।

उस दृष्टिकोण में ओ (एन) की जटिलता की गणना करने के लिए एक आसान तरीका है।

+0

हां, यह समाधान लागू करने का एक और तरीका है। मैंने इस दृष्टिकोण के बारे में भी सोचा है। –

+0

मुझे लगता है कि आपको अभ्यास में तेज़ी से मिल जाएगा (और जटिलता की एक और निश्चित गणना)। स्पैस सरणी गति के लिए एक छोटी सी जगह (शायद कम एन पर कोई भी) व्यापार करती है। – danh

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