時間の複雑さがO(mn)で、mとnが2つの入力のサイズである関数がある場合、その時間の複雑さを「線形」(mとnの両方で線形であるため)または「2次」(それは2つのサイズの製品だから)?または、他の何か?
O(m + n)も線形ですが、はるかに高速であるため、「線形」と呼ぶのは紛らわしいと感じますが、各変数で線形であるため、「二次」と呼ぶのも奇妙だと感じます。
時間の複雑さがO(mn)で、mとnが2つの入力のサイズである関数がある場合、その時間の複雑さを「線形」(mとnの両方で線形であるため)または「2次」(それは2つのサイズの製品だから)?または、他の何か?
O(m + n)も線形ですが、はるかに高速であるため、「線形」と呼ぶのは紛らわしいと感じますが、各変数で線形であるため、「二次」と呼ぶのも奇妙だと感じます。
回答:
コメント内の議論を明確にするために、成長の測定値と比較することが重要です。
@Kavehで述べたように、は両方で同時に線形ではありませんが、一方が定数でもう一方が大きくなると線形になります。
一方、はおそらく線形と見なされます。直観的には、mが 2倍になるか、nが 2倍になるか、mとnの両方が2倍になっても、m + nは2倍を超えることはできません。これはm nには当てはまりません。あればMとNの両方の二重mは、nは 4で上がり、多くのコンテキストで実行されているこの時間は、二次と考えられる理由はここにあります。いくつかの段落で文字列のマッチングを行う例を示します。
ただし、通常Big 表記を使用している場合は、特に何かを参照して使用しています。私たちはほとんどが理論家なので、一般的には問題への入力のサイズです。
たとえば、マトリックス加算を考えてみましょう。2つの行列を追加するには、O (m n )時間かかります。ただし、入力の各要素は1回だけタッチされるため、これは通常線形と呼ばれます。つまり、入力のサイズはO (m n )であるため、O (m n )の実行時間は入力のサイズに比例します。
次に、文字列の一致を見てみましょう。つまり、サイズの文字列とサイズnの文字列が与えられ、大きな文字列の中に小さな文字列が出現するかどうかを確認します。これはO (m n )時間で素朴に確認できます。これは一般に二次と見なされます。どうして?mとnが任意の場合、m = nを設定します。次に、実行時間はO (m 2)で、入力のサイズは2 mです。
一方、Rabin-Karpアルゴリズムを使用すると、(平均して)時間になります。入力は両方の文字列で構成されていたため、入力のサイズもO (m + n )でした。したがって、これは一般的に線形と呼ばれます。
まとめると、 は、入力のサイズが線形であるため、行列乗算のようなものでは一般的に線形と呼ばれますが、入力が小さいため文字列マッチングのようなものでは一般に2次と呼ばれます。どの用語が適切かは、使用するコンテキストによって異なります。