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)。这是对的吗?
答案 0 :(得分:1)
rec
自称两次,所以如果N == (n-i)
,我们可以将调用的流量设想为高度为N
的二进制三:rec
将被称为2^(N+1)-1
1}}次。
rec
还会调用其他功能,例如map<...>::size
,map<...>::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