web-dev-qa-db-ja.com

すべての組み合わせを見つけるためのこのアルゴリズムの時間の複雑さは何ですか?

組み合わせ
2つの整数nとkを指定すると、1 ... nからk個の数値のすべての可能な組み合わせを返します。
、n = 4およびk = 2の場合、解は次のとおりです。

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

個人的に思う
時間の複雑さ= O(n ^ k)、nおよびkが入力されます。
ご協力ありがとうございます
最後に、時間の複雑さ= O(C(n、k)* k)= O((n!/(k!*(n-k)!))* k )、nとkが入力され、
組み合わせを取得するたびに、subListリストをone_restにコピーする必要があります。つまり、O(k)なので、C(n、k)* kがあります。
C++
#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();
        }
    }
};
19
Zhaonan

リストを使用しているため、_Push_back_および_pop_back_はO(1)操作です。また、有効な組み合わせを1回だけ生成することになります。したがって、複雑さはO(n choose k)です。

5
Pradhan

複雑さはO(C(n,k))、つまりO(n choose k)です。

これはO(min(n^k, n^(n-k)))と同等になります。

16
Nuclearman

時間の複雑さは、存在する組み合わせの数と同じです。

この場合はn choose k

6
merlin2011

O(n ^ k)ではないと思います。それについて考えてください。 n = 100とk = 2と仮定しましょう。複雑さによると、100の2乗になります。しかし、n = 100でk = 10の場合、100の10乗になります。しかし、考えてみると、n = 100の組み合わせははるかに多くなります。 、k = 2はn = 100、k = 10よりも。複雑さは実際には実際の式です:これはn!/(k!(n-k)!)です。したがって、複雑さはO(n!/ k!(n-k)!)になります。

2
armanali