Учитывая проблему различных целых чисел, сгенерируйте все подмножества. https://www.interviewbit.com/problems/subset/
Я нашел два решения.
первое решение:
void helper_subsets(vector<vector<int>> &res , vector<int> &A ,
vector<int> &subset ,int current)
{
if (current == A.size())
res.push_back(subset) ;
else
{
helper_subsets(res,A,subset,current+1) ;
subset.push_back(A[current]) ;
helper_subsets(res,A,subset,current+1) ;
subset.pop_back() ;
}
}
vector<vector<int> >subsets(vector<int> &A) {
vector<vector<int>> res ;
sort(A.begin(),A.end()) ;
vector<int> subset ;
helper_subsets(res , A , subset , 0 ) ;
sort(res.begin(),res.end()) ;
return res ;
}
Второе решение:
void helper_subsets(vector<vector<int>> &res , vector<int> &A ,
vector<int> &subset ,int current)
{
res.push_back(subset) ;
for(int i = current ; i < A.size() ; i++)
{
subset.push_back(A[i]) ;
helper_subsets(res,A,subset,i+1) ;
subset.pop_back() ;
}
}
vector<vector<int> > subsets(vector<int> &A) {
vector<vector<int>> res ;
sort(A.begin(),A.end()) ;
vector<int> subset ;
helper_subsets(res , A , subset , 0 ) ;
sort(res.begin(),res.end()) ;
return res ;
}
Проблема в том, что я могу вычислить временную сложность первого решения математически, используя дерево рекурсии. t (n) = 2t (n-1) + c (т.е. 2 рекурсивных вызова размером n-1 и некоторое постоянное время для каждого n) t (n) = O (2 ^ n), решив указанное выше рекуррентное соотношение.
Но со вторым решением я не могу определить отношение повторения, чтобы, наконец, использовать обратную замену, чтобы получить временную сложность, и не могу получить его методом дерева повторения. Пожалуйста, помогите мне найти временную сложность второго решения.
![Учебная записка [Medium] Leetcode#22 Generate Parentheses](https://i.imgur.com/Hl2feR7b.png)
Аналогичное рекуррентное соотношение для задачи 2:
n - 1
T(n) = Σ T(n - i) + c
i = 1
- что следует из for-петли от current к A.size(). Чтобы решить эту проблему, разверните первый член:
T(n) = T(n - 1) + T(n - 2) + T(n - 3) + ... + T(1) + c
____ --------
|
| = T(n - 2) + T(n - 3) + ... + T(1) + c +
--> T(n - 2) + T(n - 3) + ... + T(1) + c
= 2 * [T(n - 2) + T(n - 3) + ... + T(1) + c]
= 2 * T(n - 1)
т.е. очень похожее рекуррентное соотношение, отличающееся только константой. Он по-прежнему оценивается как O(2^n), принимая за базовый вариант T(1) = O(1).
Нет, первое решение имеет временную сложность O (2 ^ n).