2014-07-08 9 views
12

युग्म
को देखते हुए दो पूर्णांकों n और कश्मीर, 1 से बाहर कश्मीर संख्या के सभी संभव संयोजनों लौट ... एन।
उदाहरण के लिए, यदि n = 4 और कश्मीर = 2, एक समाधान है:सभी संयोजनों को खोजने के लिए इस एल्गोरिदम की समय जटिलता क्या है?

[ 
    [2, 4], 
    [3, 4], 
    [2, 3], 
    [1, 2], 
    [1, 3], 
    [1, 4], 
] 


निजी तौर पर मुझे लगता है कि,
समय जटिलता = O (n^ट), एन और कश्मीर हैं इनपुट।
सभी मदद के लिए धन्यवाद।
अंत में, समय जटिलता = ओ (सी (एन, के) * के) = ओ ((एन!/(के! * (एन - के)!)) * के), एन और के है इनपुट,
चूंकि, जब भी हम संयोजन प्राप्त करते हैं, हमें कॉपी सबलिस्ट सूची को एक_रेस्ट में कॉपी करने की आवश्यकता होती है, जो ओ (के), है सी (एन, के) * के।
सी ++

#include <vector> 
using namespace std; 

class Solution { 
public: 
    vector<vector<int> > combine(int n, int k) { 
     vector<vector<int>> list; 

     // Input validation. 
     if (n < k) return list; 

     int start = 1; 
     vector<int> subList; 
     helper(n, k, start, list, subList); 

     return list; 
    } 

    void helper(int n, int k, int start, 
       vector<vector<int>> &list, vector<int> &subList) { 
     // Base case. 
     if (subList.size() == k) { 
      vector<int> one_rest(subList); 
      list.push_back(one_rest); 
      return; 
     } 
     if (start > n) return; 

     for (int i = start; i <= n; i ++) { 
      // Have a try. 
      subList.push_back(i); 

      // Do recursion. 
      helper(n, k, i + 1, list, subList); 

      // Roll back. 
      subList.pop_back(); 
     } 
    } 
}; 

उत्तर

5

चूंकि आप सूचियों का उपयोग कर रहे हैं, push_back और pop_backO(1) संचालन हैं। साथ ही, आप एक बार एक वैध संयोजन उत्पन्न करना समाप्त कर देते हैं। इस प्रकार, जटिलता O(n choose k) है।

+0

क्या आप ओ (एन चुनें के) जैसे संयोजन के संदर्भ में जटिलताओं को लिख सकते हैं, या आपको अंतिम समकक्ष प्रदान करना है। क्या आप मुझे इस पर संदर्भ देने के लिए इंगित कर सकते हैं। – archie

+1

'एफ (एक्स) = ओ (जी (एक्स))' एफ (एक्स) 'और' जी (एक्स) 'के सीमित व्यवहार के बारे में एक कठोर बयान है। [यहां] देखें (https://en.wikipedia.org/wiki/Big_O_notation)। 'ओ (एन का चयन करें)' कहने में कुछ भी गलत नहीं है। हालांकि, आपकी स्थिति के आधार पर, आप एक अलग दिख रहे 'जी (एक्स)' चाहते हैं। उदाहरण के लिए, यदि आप कुछ अन्य घातीय जटिलता अलगो के साथ 'ओ (एन चुनें के)' एल्गोरिदम की तुलना करने की कोशिश कर रहे हैं, तो आप 'एन चुनने के' को प्रतिस्थापित करना चाहते हैं जो [स्टर्लिंग का अनुमान] [https: // en .wikipedia.org/wiki/Binomial_coefficient # Bounds_and_asymptotic_formulas)। – Pradhan

5

समय जटिलता संयोजन देखते हैं की संख्या के बराबर है।

इस मामले में यह n choose k है।

+1

+1, सरल और स्पष्ट उत्तर, क्योंकि एल्गोरिदम को ** सभी ** संयोजन उत्पन्न करना होगा और इन्हें (दिए गए एन, के लिए) $ n के रूप में जाना जाता है, यह भी समय की जटिलता है एल्गोरिदम (अन्यथा एल्गोरिदम पक्षपातपूर्ण संयोजन उत्पन्न करेगा, या तो कुछ गायब या डुप्लिकेट) –

2

मुझे नहीं लगता कि यह ओ (एन^के) है। क्योंकि इसके बारे में सोचो। आइए एन = 100 और के = 2 मान लें। आपकी जटिलता के मुताबिक यह शक्ति 2 के लिए 100 होगा। लेकिन अगर यह एन = 100 और के = 10 है, तो यह 10 की शक्ति के लिए 100 होगा। लेकिन यदि आप इसके बारे में सोचते हैं, तो एन = 100 के साथ कहीं अधिक संयोजन हैं , एन = 100, के = 10 से के = 2। जटिलता वास्तव में वास्तविक सूत्र है: जो एन है!/(के! (एन-के)!)। और इसलिए जटिलता ओ (एन!/के! (एन-के) होगा!)।

+1

यह एक विरोधाभास आवश्यक नहीं है।बिग-ओ नोटेशन ऊपरी बाउंड निर्दिष्ट करता है और इस तरह के विशिष्ट संख्यात्मक उदाहरण इसके लिए कम लागू होते हैं। 'एन!/के! (एन-के)! 'वास्तविक सटीक गणना है और इस तरह जटिलता के लिए सबसे सख्त सीमा के रूप में कार्य कर सकते हैं। हालांकि, उत्तर समस्या परिभाषा पर निर्भर करता है। यदि दोनों 'के' और 'n' चर हैं, तो जटिलता' ओ (एन!/के! (एन-के) है!)। लेकिन अगर 'के' स्थिर है -' n!/K! (N-k)! = ओ (एन!/के! (एन-के)!) = ओ (एन^के) ' – SomeWittyUsername

14

जटिलता O(C(n,k)) है जो O(n choose k) है।

यह O(min(n^k, n^(n-k))) के बराबर होता है।

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