O(n*log n) 工作然后 O(n^2) 工作的代码的复杂性是多少?
What is the complexity of code that does O(n*log n) work, and then O(n^2) work?
我有一个算法,它首先在 O(n*log(n))
时间内做某事,然后在 O(n^2)
时间内做另一件事。我是否正确认为总复杂度为
O(n*log(n) + n^2)
= O(n*(log(n) + n))
= O(n^2)
因为 log(n) + n
被 + n
?
支配
这个说法是正确的,因为O(n log n)
是O(n^2)
的一个子集;然而,正式证明将包括选择和构造合适的常量。
如果两者的调用概率相等,那么你是对的。但是,如果两者的概率不相等,则必须进行摊销分析,将罕见的昂贵调用 (n²) 拆分为许多快速调用 (n log(n))。
例如,对于快速排序(通常需要 n log(n),但很少需要 n²),您可以证明平均 运行 时间是 n log(n),因为分摊分析。
复杂性分析的规则之一是您必须删除具有较低指数或较低因子的项。
nlogn vs n^2 (divide both by n)
logn vs n
logn 小于 n,您可以将其从复杂度方程中删除
因此如果复杂度为 O(nlogn + n^2),当 n 非常大时,与 n^2 相比,nlogn 的值并不重要,这就是为什么您将其删除并重写为 O( n^2)
我有一个算法,它首先在 O(n*log(n))
时间内做某事,然后在 O(n^2)
时间内做另一件事。我是否正确认为总复杂度为
O(n*log(n) + n^2)
= O(n*(log(n) + n))
= O(n^2)
因为 log(n) + n
被 + n
?
这个说法是正确的,因为O(n log n)
是O(n^2)
的一个子集;然而,正式证明将包括选择和构造合适的常量。
如果两者的调用概率相等,那么你是对的。但是,如果两者的概率不相等,则必须进行摊销分析,将罕见的昂贵调用 (n²) 拆分为许多快速调用 (n log(n))。
例如,对于快速排序(通常需要 n log(n),但很少需要 n²),您可以证明平均 运行 时间是 n log(n),因为分摊分析。
复杂性分析的规则之一是您必须删除具有较低指数或较低因子的项。
nlogn vs n^2 (divide both by n)
logn vs n
logn 小于 n,您可以将其从复杂度方程中删除
因此如果复杂度为 O(nlogn + n^2),当 n 非常大时,与 n^2 相比,nlogn 的值并不重要,这就是为什么您将其删除并重写为 O( n^2)