繁体   English   中英

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

[英]Understanding Time complexity of O(max(m,n))

某些机构能否给出一个简单的程序或算法,其时间复杂度为O(max(m,n))。 我试图了解渐近符号。 我遵循了一些教程,并了解了它们解释的内容,即O(n)和O(n ^ 2)。

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

首次学习大O表示法时要证明的一个普遍定理是:

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

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

作为特定示例,请考虑Knuth-Morris-Pratt字符串匹配算法 ,该算法接受两个字符串并返回第一个字符串是否为第二个字符串的子字符串。 运行时间为Θ(m + n)=Θ(max {m,n}),这意味着运行时间在两个字符串中较长者的长度上是线性的。

如果无法给出直观上具有运行时max {m,n}的内容,我深表歉意,但是从数学上讲,这确实可以解决。

希望这可以帮助!

我能想到的是Python的izip_longest函数

创建一个迭代器,以聚合每个可迭代对象中的元素。 如果可迭代项的长度不均匀,则将缺失值填充为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不会增加所需的时间。

最简单的例子是

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

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

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

我认为对您问题的最佳答案是罗伯特·哈维(Robert Harvey)的评论。 我认为,使用这种类型的边界的算法的一个很好的例子是DFS

我希望这将清除您的疑虑:

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

基于上面的观察,您可以得出DFS的时间复杂度的上限为O(max(n, m))

请注意,有些图不能仅通过O(n)约束DFS的时间复杂度。 一个完整的图就是一个例子。

此外,有些图不能仅通过O(m)约束DFS的时间复杂度。 空图就是一个例子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM