我正在阅读有关Wikipedia上的Rabin-Karp算法,并且其中提到的时间复杂度为O(n + m)。现在,根据我的理解,m必定在0到n之间,所以最好的情况下复杂度为O(n),最坏的情况下复杂度也为O(2n)= O(n),为什么不呢?只是O(n)?
答案 0 :(得分:4)
罗宾·卡普(Robin-Karp)基本上用O(m+n)
表示它的渐近符号,以此表示相对于m+n
而不是n
花费线性时间这一事实。本质上,每当使用渐近表示法时,变量m
和n
都必须表示某些含义。对于Robin-Karp算法,n
代表文本的长度,m
代表文本和图案的组合长度。请注意,O(2n)
与O(n)
的含义相同,因为O(2n)
仍然是 just n
的线性函数。但是,对于Robin-Karp,m+n
并不是 just n
的功能。相反,它是两个独立变量m
和n
的函数。因此,O(m+n)
的含义与O(n)
等于O(2n)
的含义不同。
我希望这是有道理的。 :-P
答案 1 :(得分:0)
m
和n
测量输入数据的不同维度。长度为n
的文本和长度为m
的样式与长度为2n
的文本和长度为0
的样式不同。
O(m+n)
告诉我们,复杂度与文本的长度和图案的长度成正比。
答案 2 :(得分:0)
在某些情况下,用O(n+m)
形式表示复杂性比仅说O(max(m,n))
更为合适。
场景:
将 BFS (宽度优先搜索)或 DFS (深度优先搜索)作为方案。
这样会更加直观,并且会传达更多信息,表明复杂度是O(E+V)
比max{E,V}
。前者与实际算法描述保持同步。