Учитывая проблему различных целых чисел, генерировать все подмножества.
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), решая вышеуказанное рекуррентное соотношение.
Но со вторым решением я не могу определить рекуррентное отношение, чтобы, наконец, использовать обратную подстановку, чтобы получить сложность времени, и не смог получить ее методом дерева рекуррентности. Пожалуйста, помогите мне найти временную сложность второго решения.