如果我有一个函数,其时间复杂度为O(mn),其中m和n是其两个输入的大小,我们将其时间复杂度称为“线性”(因为在m和n中均为线性)或“二次”(因为它是两种尺寸的产品)?或者是其他东西?
我觉得称它为“线性”是令人困惑的,因为O(m + n)也是线性的,但速度要快得多,但是我觉得称其为“二次数”也是很奇怪的,因为它在每个变量中都是线性的。
如果我有一个函数,其时间复杂度为O(mn),其中m和n是其两个输入的大小,我们将其时间复杂度称为“线性”(因为在m和n中均为线性)或“二次”(因为它是两种尺寸的产品)?或者是其他东西?
我觉得称它为“线性”是令人困惑的,因为O(m + n)也是线性的,但速度要快得多,但是我觉得称其为“二次数”也是很奇怪的,因为它在每个变量中都是线性的。
Answers:
为了阐明评论中的讨论,衡量相对增长是很重要的。
如@Kaveh所述,并非同时呈线性,但如果一个为常数而另一个为增长,则为线性。
另一方面,可能被认为是线性的。直观地,如果m加倍,或者n加倍,或者即使m和n都加倍,则m + n不能超过一倍。m n并非如此;如果m和n都加倍,则m n增加4。这就是为什么在许多情况下,该运行时间将被视为平方的原因。我在几个段落中给出了一个字符串匹配的例子。
但是通常在使用Big- 表示法时,是将其用于特定的引用。由于我们大多是理论家,因此通常是问题输入的大小。
让我们以矩阵加法为例。将两个矩阵相加需要O (m n )时间。但是我们输入的每个元素仅被触摸一次,因此通常将其称为线性。换句话说放,我们的输入是大小为ø (米Ñ ),因此运行时间ø (米Ñ )是线性的输入的大小。
现在让我们看一下字符串匹配-即,给我们一个大小为的字符串和一个大小为n的字符串,我们想看看在较大的字符串中是否存在较小的字符串。我们可以在O (m n )时间里天真地检查它;通常将其视为二次方。为什么?如果m和n可以为任意值,则设置m = n。那么我们的运行时间为O (m 2),我们的输入大小为2 m。
另一方面,如果使用Rabin-Karp算法,则(平均)时间。我们的输入包含两个字符串,因此我们的输入大小也为O (m + n )。因此,通常将其称为线性。
总结一下: 对于矩阵乘法之类的事物,通常被称为线性,因为它在输入大小上是线性的,但是对于字符串匹配之类的事物,由于输入较小,通常被称为二次数。哪个术语合适取决于您在其中使用的上下文。