あなたが説明したアルゴリズムは、次の C コードのように見えます。
//for each entry
for(int x = 0; x < width; ++x)
for(int y = 0; y < height; ++y)
{
char lookFor = entries[x][y];
int area = 0;
for(int row = y; row < height; ++row)
{
if(entries[x, row] != lookFor)
break;
for(int col = x; col < width; ++col)
{
if(entries[col, row] != lookFor)
break;
int currentArea = (col - x + 1) * (row - y + 1);
if(currentArea > area)
{
//save the current rect
}
}
}
}
4 つのネストされたループがあります。外側のループは、正確にn
(n
エントリの数で) 繰り返されます。内側のループは平均でwidth * f1
とheight * f2
回反復されます ( とf1
はf2
一定の割合で)。残りのアルゴリズムには一定の時間がかかり、問題のサイズには依存しません。
したがって、複雑さはO(n * f1 * width * f2 * height) = O(n^2)
であり、これは本質的に「各エントリに移動し、そこから各エントリに再度アクセスする」ことを意味します。これは、すべてのエントリを実際にチェックする必要があるか、問題のサイズに応じて増加する一定の割合にすぎないかは関係ありません。
編集
上記の説明は、エントリがランダムに分散されておらず、フィールドが大きいほど均一な部分領域が大きくなる可能性が高いことを前提としています。これが当てはまらず、内部ループの平均反復回数がフィールド サイズにまったく依存しない場合 (たとえば、ランダムに分散されたエントリの場合)、結果として生じる時間計算量は次のようになります。O(n)