アルゴリズムを少なくともO(n ^(3/2))の複雑さまで下げようとしています。アルゴリズムは次のとおりです。
function( string s, int n )
{
bool result = false;
int position = 0;
for( int i = 0; i < n/2; i++ )
{
position = 0;
for( int j = i+1; j < n; j++ )
{
if( s[j] != s[position] ) break;
if( j == n ) result = true;
if( position == i ) position = 0;
else position++;
}
if(result) break;
}
return result;
}
最初のforループはn/2回繰り返されます。これは、O(n)の複雑さです。内部のforループを最大でO(sqrt(n))にする必要があるため、アルゴリズム全体にO(n ^(3/2))の複雑さが与えられます。ネストされたforループが必要な複雑さであるかどうかを判断するのに苦労しています。
注:
n
は文字列のサイズです。この関数は基本的に、文字列sで繰り返しパターンが発生するかどうかを確認します。sの文字は"0"
とだけ"1"
です。たとえば、文字列が"001001"
である場合、パターンはで"001"
あり、2回発生します。文字列も偶数です。そうは言っても、構文と機能はこの質問には関係ありません。すべての基本的なアクションは、O(1)(定数)時間かかると見なされます。これは、このコードのほぼ全体です。
注2:
宿題のためにやっています。しかし、宿題の質問は、私が行ったアルゴリズムを機能させることだけでした。複雑さを軽減することは、実践するための余分な作業にすぎません。
どんな助けやガイダンスもいただければ幸いです!