了解O的时间复杂度(max(m,n))

时间:2013-10-18 17:45:25

标签: algorithm math big-o time-complexity

某些机构可以给出时间复杂度为O(max(m,n))的简单程序或算法。我试图理解渐近符号。我按照一些教程并理解他们解释的是O(n)和O(n ^ 2)。

但现在我想了解O(max(m,n))的时间复杂度及其计算方法。 请提供示例程序或算法来证明这一点。

4 个答案:

答案 0 :(得分:3)

首次研究big-O表示法时要证明的一个常见定理是

  

Θ(max {m,n})=Θ(m + n)

换句话说,任何运行时为O(max {m,n})的算法也有运行时O(m + n),因此任何具有这种时间复杂度的算法都符合要求。

作为一个具体的例子,考虑Knuth-Morris-Pratt string-matching algorithm,它接收两个字符串并返回第一个字符串是否是第二个字符串的子字符串。运行时是Θ(m + n)=Θ(max {m,n}),这意味着运行时在两个字符串中较长的字符串的长度上是线性的。

我道歉,如果这不会给出直觉具有运行时最大值{m,n}的内容,但数学上确实可以解决这个问题。

希望这有帮助!

答案 1 :(得分:1)

我能想到的是Python's izip_longest function

  

创建一个聚合来自每个迭代的元素的迭代器。   如果迭代的长度不均匀,则填充缺失值   有fillvalue。迭代继续,直到最长的可迭代为止   耗尽。

例如:

In [1]: from itertools import zip_longest

In [2]: list(zip_longest([1, 2, 3, 4, 5, 6, 7], ['a', 'b', 'c']))
Out[2]: [(1, 'a'), (2, 'b'), (3, 'c'), (4, None), (5, None), (6, None), (7, None)]

In [3]: list(zip_longest([1, 2], ['a', 'b', 'c']))
Out[3]: [(1, 'a'), (2, 'b'), (None, 'c')]

In [4]: list(zip_longest([1, 2, 3], ['a', 'b', 'c']))
Out[4]: [(1, 'a'), (2, 'b'), (3, 'c')]

据我所知,应该清楚为什么这是O(max(m, n))操作而不是O(m + n);因为在m > n时,增加n不会增加所需的时间。

答案 2 :(得分:0)

最简单的例子是

for i=0 to max(m,n)
     print 'a'

从理论上讲:O(max(m,n))只是O(m+n)

O(max(m,n))的“真实生活”示例可能是分别为大小mn的两个未排序数组的算法 - 找到两者的最大元素

答案 3 :(得分:0)

我认为你问题的最佳答案是Robert Harvey的评论。在我看来,使用这种边界的算法的一个很好的例子是DFS

我希望,这将清除你的怀疑:

DFS检查图形的每个顶点和每个边缘。设n表示图中的顶点数,m表示其中的边数。

根据上述观察,您可以将DFS的时间复杂度的上限推导为O(max(n, m))

请注意,有些图表无法将DFS的时间复杂度仅限于O(n)complete graph就是一个例子。

此外,还有一些图表,您无法将DFS的时间复杂度仅限于O(m)null graph就是一个例子。