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)