【问题标题】:time complexity : why O(nlogn)?时间复杂度:为什么 O(nlogn)?
【发布时间】:2019-07-10 21:59:46
【问题描述】:

我有一个文档说给定代码的平均案例时间复杂度是 O(nlog2n)

Random r = new Random();
int k = 1 + r.nextInt(n);
for (int i = 0; i < n ; i += k);

我计算了最好和最坏的情况:

最佳情况,k = n 导致时间复杂度为O(1)

最坏的情况,k = 1 导致时间复杂度为O(n)

平均情况如何为 O(nlog2n),高于最坏情况。我错过了什么吗?

编辑: 文档可能容易出错,那么在这种情况下,上述代码的平均时间复杂度是多少,为什么?

【问题讨论】:

  • 您确定您复制的问题正确吗?
  • 可以,但文档可能容易出错。
  • 看起来它可以是 O logN,如果你得到这样的 k 值。基本上,这取决于随机数是如何生成的。
  • @uneq95 ,是的 O(logn) 是有道理的,但我想要证明/一些解释。
  • @Saad 我的答案有证据。

标签: java algorithm time-complexity logarithm


【解决方案1】:

对于给定的 k 值,for 循环运行 n/k 次。 (我忽略了四舍五入,这使得分析有点复杂但不会改变结果)。

对所有 k 值求平均值:(n/1 + n/2 + n/3 + ... + n/n) / n。这是第 n 个harmonic number。谐波数趋向于 log(n)。

因此,此代码的平均运行时复杂度为 log(n)。这是 O(log n) 或等效的 O(log_2 n)。

也许你的书有一个额外的外部循环,运行这段代码 n 次?

【讨论】:

    猜你喜欢
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2020-01-10
    • 2023-04-02
    相关资源
    最近更新 更多