它是O(n²),其中 n = max(length(s1),length(s2))(可以在小于二次的时间内确定 - 见下文)。我们来看一个教科书的定义:
f(n) ∈ O(g(n)) 如果存在正实数 c 和正整数 N 使得 f(n) = N
通过这个定义,我们看到 n 代表一个数字 - 在这种情况下,这个数字是传入的字符串的长度。但是,有一个明显的差异,因为这个定义只提供了单个变量函数 f(n) 和在这里,我们清楚地传入了 2 个具有独立长度的字符串。因此,我们搜索 Big O 的多变量定义。然而,正如 Howell 在 "On Asymptotic Notation with Multiple Variables" 中所展示的那样:
“不可能为多变量函数定义大 O 表示法以隐含所有这些 [通常假定的] 属性。”
Big O with multiple variables 实际上有一个正式的定义,但这需要满足单个变量 Big O 之外的额外约束,并且超出了大多数(如果不是全部)算法课程的范围。对于典型的算法分析,我们可以通过将所有变量绑定到限制变量n 来有效地将函数简化为单个变量。在这种情况下,变量(特别是 length(s1) 和 length(s2))显然是独立的,但可以绑定它们:
方法一
Let x1 = length(s1)
Let x2 = length(s2)
此函数的最坏情况发生在没有匹配项时,因此我们执行 x1 * x2 迭代。
因为乘法是可交换的,所以最坏情况 foo(s1,s2) == 最坏情况 foo(s2,s1)。因此,我们可以不失一般性地假设 x1 >= x2。 (这是因为,如果 x1
方法2(如果你不喜欢第一种方法)
对于最坏的情况(其中 s1 和 s2 不包含公共字符),我们可以在遍历循环之前确定 length(s1) 和 length(s2)(在 .NET 和 Java 中,确定 a string 是 O(1) - 但在这种情况下是 O(n)),将较大的分配给 x1,将较小的分配给 x2。这里很明显 x1 >= x2。
对于这种情况,我们将看到确定 x1 和 x2 的额外计算使这个 O(n² + 2n) 我们使用以下简化规则 which can be found here 简化为 O(n²):
如果 f(x) 是多项之和,则保留增长率最大的一项,其余的则省略。
结论
对于n = x1(我们的限制变量),例如x1 >= x2,最坏的情况是x1 = x2。
因此:f(x1) ∈ O(n²)
额外提示
对于所有homework problems posted to SO related to Big O notation,如果答案不是以下之一:
O(1)
O(log log n)
O(log n)
O(n^c), 0<c<1
O(n)
O(n log n) = O(log n!)
O(n^2)
O(n^c)
O(c^n)
O(n!)
那么问题是可能最好发布到https://math.stackexchange.com/