एल्गोरिदम: मैं O (n) और O (nlog (n)) को एक साथ कैसे जोड़ सकता हूं?


22

मेरे पास अनुसरण एल्गोरिथ्म है जो डुप्लिकेट ढूंढता है और उन्हें निकालता है:

public static int numDuplicatesB(int[] arr) {
    Sort.mergesort(arr);
    int numDups = 0;
    for (int i = 1; i < arr.length; i++) {
        if (arr[i] == arr[i - 1]) {
            numDups++;
} }
    return numDups;
}

मैं इस मामले में सबसे खराब स्थिति का पता लगाने की कोशिश कर रहा हूं। मुझे पता है कि मर्जसॉर्ट है nlog(n), और मेरे लिए लूप में मैं पूरे डेटा सेट पर पुनरावृत्ति कर रहा हूं ताकि यह गणना हो n। मैं अनिश्चित हूं कि इन नंबरों के साथ क्या करना है। क्या मुझे बस उन्हें एक साथ योग करना चाहिए? अगर मैं ऐसा करता, तो मैं यह कैसे करता?


1
ध्यान दें: आप स्मृति आवश्यकताओं के आधार पर O (n) में ऐसा करने के लिए हैश टेबल का उपयोग कर सकते हैं।
corsiKa

जवाबों:


67
O(n) + O(n log(n)) = O(n log(n))

बिग ओ जटिलता के लिए, आप सभी के बारे में परवाह करते हैं कि यह प्रमुख शब्द है। n log(n)हावी है nइसलिए यह एकमात्र ऐसा शब्द है जिसकी आपको परवाह है।


4
इस बारे में सोचने का एक और तरीका यह है कि आपके O (n) प्रसंस्करण की कल्पना वास्तव में O (n log n) थी, हालाँकि आपने दो स्वतंत्र प्रकार किए थे। फिर आपके पास 2 * O (n log n) होगा। लेकिन स्थिरांक धीमा हो जाता है, इसलिए आप O (n log n) पर वापस आ जाते हैं।
जोनाथन यूनिस

4
@ जोनाथन जब व्यवहार में काम करता है, तो यह बहुत सही है कि O (n) O (n log (n)) के बराबर नहीं है , इसलिए मैं नियमित आधार पर इसका उपयोग करने की सलाह नहीं दूंगा।
आजा

17
@ इमरकुल वास्तव में मुझे लगता है कि तर्क सैद्धांतिक रूप से ध्वनि के साथ-साथ व्यावहारिक भी है। O (n) O (n log (n)) का एक उचित उपसमूह है। अतः यदि f (n) O (n) से संबंधित है तो यह O (n लॉग (n)) से भी संबंधित है।
एमोरी

17
यह ध्यान दिया जाना चाहिए कि जब हम कहते हैं f(n) is O(g(n))कि हम वास्तव में क्या कह रहे हैं तो यह है कि फ़ंक्शन f is a member of the set of functions that grows at the rate of at most g(n) over the long term। इसका मतलब है कि सभी सदस्य O(n)भी इसके सदस्य हैं O(n*log(n))+भाव में पसंद O(f(n)) + O(g(n))वास्तव में सेट गठबंधन (जिनमें से तुम सच में पंडिताऊ कर रहे हैं, क्या तुम सच में उपयोग करना चाहिए ∪) का संदर्भ लें।
रेयान

3
@ लाइरेन मूल रूप से, यह सेट यूनियन नहीं है, लेकिन सेट राशि A + B = { a + b | a in A, b in B }:। ऐसा होता है कि फॉर्म के सेट के लिए O(g(n))यह सेट यूनियन के समान होता है , क्योंकि सेट में से एक हमेशा दूसरे का एक सबसेट होता है, और वे दोनों रकम के लिए अपरिवर्तित होते हैं (यानी ए + ए = ए)। (उफ़, नैट ने अनिवार्य रूप से समान लिखा था)।
पाओलो एबरमन

56

चलो इसके माध्यम से हमारे रास्ते का कारण और की परिभाषा को याद करते हैं O। मैं जो उपयोग करने जा रहा हूं वह अनंत की सीमा के लिए है।

आप करते हुए कहा कि आप में से asymptotic सीमा इसी के साथ दो कार्रवाई करने में सही कर रहे हैं O(n)और O(nlog(n))लेकिन उन्हें एक ही बाध्य में संयोजन दो कार्यों को जोड़ने के रूप में सरल रूप में नहीं है। आप जानते हैं कि आपका कार्य कम से कम O(n)समय और कम से कम समय लेता है O(nlog(n))। तो सच में अपने कार्य के लिए जटिलता वर्ग का मिलन है O(n)और O(nlog(n))लेकिन O(nlog(n))का सुपरसेट है O(n)तो वास्तव में यह सिर्फ है O(nlog(n))


12
+1 यह उत्तर होना चाहिए। यह compsci शब्दों का उपयोग करके उत्तर का अधिक सटीक वर्णन करता है।

5

यदि आप इसे लंबे समय तक सेट करने जा रहे हैं तो यह इस तरह दिखाई देगा:

मान लीजिए कि कुल समय है: a + bn log (n), जहां a और b स्थिरांक हैं (निचले क्रम की शर्तों की अनदेखी)।

जैसा कि n अनंत तक जाता है (a + bn log (n)) / n log (n) -> a / log (n) + b -> b

तो कुल समय O (bn log (n)) = O (n log (n)) है।


2

O की परिभाषा से शुरू करें ():

O (n log n) का अर्थ है "C n लॉग एन से कम, यदि n बड़ा है"।

O (n) का अर्थ है "D n से कम, यदि n बड़ा है"।

यदि आप दोनों को जोड़ते हैं, तो परिणाम C n लॉग एन + डी एन <सी एन लॉग एन + डी एन लॉग एन <(सी + डी) एन लॉग एन = ओ (एन लॉग एन) से कम है।

सामान्य तौर पर, यदि f (n)> C g (n) बड़े n और कुछ C> 0 के लिए, तो O (f (n)) + O (g (n)) = O (f (n))। और O () की परिभाषा का उपयोग करके कुछ मामलों को करने के बाद, आपको पता चल जाएगा कि आप क्या कर सकते हैं और क्या नहीं।


1

बड़े O अंकन को एक सेट के रूप में परिभाषित किया गया है:

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

इसलिए यहाँ छवि विवरण दर्ज करेंसभी कार्य शामिल हैं - कुछ मनमाने बड़े बिंदु से शुरू यहाँ छवि विवरण दर्ज करें- हमेशा जी से छोटा।

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

अधिक औपचारिक रूप से:

f, h \ in \ mathcal {O} (g) \ Rightarrow (f + h) \ in \ mathcal {O} (g)

आप आसानी से यह साबित कर सकते हैं।

टी एल; डॉ

यह अभी भी है एन लॉग (एन)

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