查找回溯解决方案的时间复杂度以生成所有子集问题

时间:2018-10-30 13:28:55

标签: recursion time-complexity subset backtracking recurrence

给出不同整数的问题,生成所有子集。 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)。

但是在第二种解决方案中,我无法定义递归关系以最终使用反向替换来获取时间复杂度,而无法通过递归树方法来获取它。请帮助我找到第二种解决方案的时间复杂性。

1 个答案:

答案 0 :(得分:0)

问题2的类似递归关系是:

       n - 1
T(n) =   Σ  T(n - i) + c
       i = 1

–从forcurrent的{​​{1}}循环之后。要解决此问题,请展开第一个术语:

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)