O(mn)は「線形」または「2次」成長と見なされますか?


24

時間の複雑さがO(mn)で、mnが2つの入力のサイズである関数がある場合、その時間の複雑さを「線形」(mnの両方線形であるため)または「2次」(それは2つのサイズの製品だから)?または、他の何か?

O(m + n)も線形ですが、はるかに高速であるため、「線形」と呼ぶのは紛らわしいと感じますが、各変数で線形であるため、「二次」と呼ぶのも奇妙だと感じます。


7
何で線形と言うが重要です。たとえば、エッジと個の頂点を持つグラフが場合、はエッジの数では線形ですが、(潜在的に)頂点の数では2次です。n O m + n mnO(m+n)
ラファエル

3
ラファエルのコメントはスポットだと思います。「線形」は、多くの場合、入力のサイズに関連して使用する必要があります。入力のサイズがため、行列を転置する場合、は「線形」です。文字列内の文字列の出現を検索する場合、は線形ではありません--- O(m + n)になります。O m n O m n n m O m n O m + n m×nO(mn)O(mn)nmO(mn)O(m+n)
SamM

3
@Raphaelのコメントにも同意しますが、同時に、特定の時間の複雑さは何に対して言及せずに「線形」であると人々が言うのを聞くことも珍しくありません。また、場合によっては重要ではありません。たとえば、O(m + n)はすべての入力に対して線形であるため、SamMが上記のように線形と呼ぶことは二度と考えません。しかし、それは疑問を投げかけます:O(mn)が線形でないとしたら、それは何ですか?
Mehrdad

3
@Mehrdad:ベースラインは「入力がバイナリストリングとしてエンコードされていると仮定した場合(Turingマシンテープ上)」の入力サイズだと思います。この入力サイズは、と自体の関数です。SamMは良い例を示します。mnm
ラファエル

1
複数変数のランドー表記については、people.cis.ksu.edu /〜rhowell / asymptotic.pdf も参照してください。
ジョナスケルカー

回答:


18

数学では、このような関数は多重線形関数と呼ばれます。しかし、コンピューター科学者はおそらくこの用語を一般に知らないでしょう。数学またはコンピューターサイエンスのいずれにおいても、mおよびnのいずれかを定数と合理的にみなすことができる場合を除き、この関数を間違いなく線形と呼ぶべきではありませmn


nのいずれかを定数と見なすことが合理的である理由 mn
user2768

11

コメント内の議論を明確にするために、成長の測定値と比較することが重要です。

@Kavehで述べたように、は両方で同時に線形ではありませんが、一方が定数でもう一方が大きくなると線形になります。O(mn)

一方、はおそらく線形と見なされます。直観的には、mが 2倍になるか、nが 2倍になるか、mnの両方が2倍になっても、m + nは2倍を超えることはできません。これはm nには当てはまりません。あればMNの両方の二重mは、nは 4で上がり、多くのコンテキストで実行されているこの時間は、二次と考えられる理由はここにあります。いくつかの段落で文字列のマッチングを行う例を示します。O(m+n)mnmnm+nmnmnmn

ただし、通常Big 表記を使用している場合は、特に何かを参照して使用しています。私たちはほとんどが理論家なので、一般的には問題への入力のサイズです。O

たとえば、マトリックス加算を考えてみましょう。2つの行列を追加するには、O m n 時間かかります。ただし、入力の各要素は1回だけタッチされるため、これは通常線形と呼ばれます。つまり、入力のサイズはO m n であるため、O m n )の実行時間は入力のサイズに比例します。m×nO(mn)O(mn)O(mn)

次に、文字列の一致を見てみましょう。つまり、サイズの文字列とサイズnの文字列が与えられ、大きな文字列の中に小さな文字列が出現するかどうかを確認します。これはO m n 時間で素朴に確認できます。これは一般に二次と見なされます。どうして?mnが任意の場合、m = nを設定します。次に、実行時間はO m 2で、入力のサイズは2 mです。mnO(mn)mnm=nO(m2)2m

一方、Rabin-Karpアルゴリズムを使用すると、(平均して)時間になります。入力は両方の文字列で構成されていたため、入力のサイズもO m + n でした。したがって、これは一般的に線形と呼ばれます。O(m+n)O(m+n)

まとめると、 は、入力のサイズが線形であるため、行列乗算のようなものでは一般的に線形と呼ばれますが、入力が小さいため文字列マッチングのようなものでは一般に2次と呼ばれます。どの用語が適切かは、使用するコンテキストによって異なります。O(mn)


8

で実行時間を測定している場合、O m n m n )の線形関数ではありませんmnの間に関係がない場合、この関数は一般に2次的に成長する可能性があります。(m,n)O(mn)(m,n)mn

ただし、それらは個別に線形関数です。つまり、それらの1つを修正し、他の変数の増加を見ると、他の変数の線形関数になります。


3

複数の入力を持つ問題の複雑さを測定するための1つの方法は、支配的な変数を見つけ、その変数に基づいて他の入力をバインドすることです。このアプローチを使用すると、単一変数に基づいた複雑度関数を使用できます


2
たとえば、ノードとエッジの数がある場合、支配的な変数がない場合があります。
ラファエル

0

言語と関数Fよう分間{ | w 1 | | w 2 | } F | W |毎ため、W = W 1wの2LL={w1#w2|wi(Σ{#}),}fmin{|w1|,|w2|}f(|w|)w=w1#w2Lあなたの実行時間を推定することができを認識するアルゴリズムLのように OF | wは|| W | - F | wは|= OF | w || w |f | w | O(|w1||w2|)LO(f(|w|)(|w|f(|w|))=O(f(|w|)|w|f(|w|)2)=O(f(|w|)|w|)

O(nlogn)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.