大O符号的一个属性是 sum sure ,哪个指出,当我有两个函数 $ f_1 $ $ f_2 $ 及其相应的复杂性功能是 $ g_1 $ $ g_2 $ ,然后组合复杂性是 $ f_1 + f_2= o(\ max(g_1,g_2))$

但如果两个复杂性函数相等,我们会选择什么?例如,如果 $ f_1(n)$ 是数组和 $ _ f2(m)$ 的排序同样,那么复杂性是<跨越类=“math-container”> $ o(n \ log(n))$ 和 $ o(m \ log( m))$ 。应用规则将是 $ o(\ max(n \ log(n),m \ log(m)))$ 。我认为选择其中任何一个都会产生有效但非常不完全的估计,因为您将删除一个变量。除此之外,还不清楚哪一个。

是在有多个变量涉及的变量时不应该使用规则吗?

有帮助吗?

解决方案

取决于某些变量是否依赖于另一个变量,或者如果它们作为问题的参数给出。例如,在许多与图形相关的问题中, $ n $ 可以是顶点的数量,而 $ m $ 可以是边缘的数量。在这种情况下, $ m $ 可以像 $ o(n ^ 2)$ 。因此,在一般情况下,假设我们有一个算法,其第一阶段在 $ o(n)$ $ O(m)$ ,我们只需将两个术语添加在一起,不要尝试简化---最终的运行时是 $ o(n + m) $

在若干变量中作为不一定相关的参数的变量:在最终方程内的大量变量是标准的,例如,我可以说乘以 $ m \ time n $ 矩阵和 $ n \ times p $ 矩阵使用 $ o(mnp)$ -time使用上学簿乘法,或解决knapsack问题需要 $ o(nt)$ < / span> - 时间 $ n $ 是项目和 $ t $ 是目标和。

在平面图和其他稀疏图中的特殊情况下,我们知道<跨度类=“math-container”> $ m= o(n)$ ,因此我们可以安全地替换 $ n $ 代替 $ m $ 在最终运行时间以简化。

作为介绍,这说明了为什么在稀疏图表中(其中 $ m= o(n)$ )一个人更愿意在循环中使用dijktra的循环 - 对最短路径(与Ployd-Warshall等基于基于闭合的算法相比);自行以来,Dijkstra在 $ o(m \ log n)= O(n \ log n)$ 中,循环中使用dijkstra的总体复杂性变为 $ O(n ^ 2 \ log n)$ ,比Floyd-Warshall更好。相比之下,请注意,Dijkstra在 $ m \ log n $ 中运行的常规情况,这意味着在 $的密集图上m= o(n ^ 2)$ ,在最坏情况下运行时间内变得效率低于Floyd-Warshall。

在其他情况下,可以有变量甚至没有由给定参数多项式界限 - 拍摄上面的背包示例,其中 $ t $ 可以是 $ n $

中的指数

其他提示

没有一般答案。顺便说一下,如果要简化 $ o(\ max(n \ log(n),m \ log(m)))$ ,您可以重写它与 $ o((n + m)\ log(n + m))$

此外,如果 $ g_1 $ $ g_2 $ 是equl和越来越多的函数,则可以写 $ o(g_1(n + m))$ 而不是 $ o(\ max(g_1(n),g_2(g_2)(m)))$

通过定义 $ o(g)$ 应始终定义可变和限制点,以考虑 $ o $ 。例如,在<跨越类=“math-container”> $ o(n ^ 3)中,n \ to \ idty $ 变量是 $ n $ 和限制点 $ \ idty $ 。在 $ o(x ^ 3)中,x \ to 0 $ 变量是 $ x $ 和限制点 $ 0 $

所以当我们写入 $ f= o(g)$ 时,那么正式我们的意思是一些变量和一些限制点。例如 $ f(n)= o(g(n)),n \ to \ idty $ 是精确的记录。注意,记录 $ f(m)= o(g(m)),m \ to \ idty $ 意味着与先前的句子完全相同。

当我们谈论属性 $ f_1 + f_2= o(\ max(g_1,g_2))$ ,那么这里也应该陈述一些变量(s )和一些限制点。所以确切的记录应该是类似的 $$ f_1(n)+ f_2(n)= o(\ max(g_1,g_2)(n)),n \ to \ infty $$ 或者我们需要更多地澄清变量,假设限制点 $ \ idty $

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top