【问题标题】:How to do Harmonic Sum in O(lg n)?如何在 O(lg n) 中进行谐波和?
【发布时间】:2021-04-21 21:43:33
【问题描述】:

我最近在 Steven Skiena 的“算法设计手册”中读到谐波 Sum 是 O(lg n)。我理解这在数学上是如何实现的,但是当我看到它的递归解决方案时,如下所示:

public static double harmonic(int n) {
if(n == 1) {
    return 1.0;
} else {
    return (1.0 / n) + harmonic(n - 1);
}

}

我看不出这是 O(lg n),我认为它是 O(n)。如果是这样的话,上面的代码真的是 lg(n) 吗?如果没有,有人可以给我举个例子吗?

【问题讨论】:

  • 您将渐近符号与时间复杂度分析混淆了。 n 项之和的 为 O(log n),这与计算该值所需的时间不同。渐近符号可用于描述任何函数,而不仅仅是输出为运行时间的函数。
  • 对不起,我不明白你的意思。输出为运行时间的函数是什么意思?

标签: math big-o logarithm


【解决方案1】:

我认为这里的困惑在于,大 O 表示法不仅可以用于运行时间,还可以用于一般函数的增长。

作为kaya3 cmets,上述函数的返回值O(lg n),也就是说它以lg n的速度渐近增长em> 随着你增加 n。这很可能是这本书所声称的。它是harmonic series 的数学属性。

然而,函数的运行时间需要 O(n) 时间。这就是您所声称的,而且完全正确(假设是常数时间算术)。

如果您仍然对如何将 big-O 表示法用于算法运行时间以外的目的感到困惑,我建议您查看其definition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多