Подтвердить что ты не робот

Какова временная сложность этого алгоритма для нахождения всех комбинаций?

Комбинации
Для двух целых чисел n и k вернуть все возможные комбинации k чисел из 1... n.
Например. Если 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 вводится,
Поскольку каждый раз, когда мы получаем комбинацию, нам нужно скопировать список сублистов в one_rest, который является O (k), существует C (n, k) * k.
С++
#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();
        }
    }
};
4b9b3361

Ответ 1

Поскольку вы используете списки, push_back и pop_back являются операциями O(1). Кроме того, вы в конечном итоге генерируете действительную комбинацию ровно один раз. Таким образом, сложность O(n choose k).

Ответ 2

Сложность O(C(n,k)), которая O(n choose k).

В итоге это эквивалентно O(min(n^k, n^(n-k))).

Ответ 3

Сложность времени равна количеству комбинаций.

В этом случае это n choose k.

Ответ 4

Я не думаю, что это O (n ^ k). Потому что думай об этом. Пусть n = 100 и k = 2. В соответствии с вашей сложностью она будет равна 100. Но если это n = 100 и k = 10, то это будет 100 к мощности 10. Но если вы думаете об этом, есть гораздо больше комбинаций с n = 100, k = 2, чем n = 100, k = 10. На самом деле сложностью является фактическая формула: n!/(K! (N-k)!). И, следовательно, сложностью будет O (n!/K! (N-k)!).