这个递归函数的时间复杂度是多少?

时间:2015-09-03 15:47:02

标签: c++ recursion time-complexity

void rec( char s1[], char s2[], int i,  map< char, int > m1, map< char, int > m2 ) {
    if ( i == n ){
        return;
    }
    rec( s1, s2, i+1, m1, m2 );
    m1[ s1[ i ] ]--;
    if ( m1[ s1[ i ] ] == 0 ){
        m1.erase( s1[ i ] );
    }
    m2[ s2[ i ] ]--;
    if ( m2[ s2[ i ] ] == 0 ){
        m2.erase( s2[ i ] );
    }
    m2[ s1[ i ] ]++;
    m1[ s2[ i ] ]++;
    if ( max( ( m1.size() ), ( m2.size() ) ) < mn ){
        mn = max( ( m1.size() ), ( m2.size() ) );
    }
    rec( s1, s2, i+1, m1, m2 );
}

mn是一个全局变量。这个递归函数的时间复杂度是多少?假设n(&lt; = 20)已被视为输入.n也是全局的。并且还假设它是从main调用的,

REC(S1,s2,0,M1,M2);

我的猜测是O(logn * 2 ^ n)。这是对的吗?

1 个答案:

答案 0 :(得分:1)

rec自称两次,所以如果N == (n-i),我们可以将调用的流量设想为高度为N的二进制三:rec将被称为2^(N+1)-1 1}}次。

rec还会调用其他功能,例如map<...>::sizemap<...>::operator[]map<...>::erase等。这些功能中最昂贵的应该是O(log M),其中M 1}}是地图的大小。它们是按顺序调用的,因此我们只需要为rec的每次调用都考虑最昂贵的这些操作。

最终的复杂性因此为O(2^N * log M)N == (n-i)M == max size of m1 and of m2