【问题标题】:What is the complexity of multiple runs of an O(n log n) algorithm?多次运行 O(n log n) 算法的复杂度是多少?
【发布时间】:2015-08-06 15:16:45
【问题描述】:

如果问题大小是 n,并且每次算法将问题大小减少一半,我相信复杂度是 O (n log n),例如归并排序。所以,基本上你正在运行一个(log n)算法(比较)n次......

现在的问题是,如果我有一个大小为 n 的问题。我的算法能够在一次运行中将大小减少一半,每次运行需要 O(n log n)。这种情况的复杂性是什么?

【问题讨论】:

  • 用我认为发布的算法来计算会更容易
  • 合并排序是 O(n*logn) 因为它在将大小减半后执行了两次递归调用。如果它只进行一次递归调用,它将是 O(n) (参见例如快速选择算法)。因此,您需要更具体地了解您所讨论的算法,以便分析其复杂性。

标签: algorithm time-complexity


【解决方案1】:

如果问题在大小为 n 处进行 n 步,当 n > 1 时,在大小 floor(n/2) 处额外运行,则总共需要 O(n) 时间:n + n/2 + n/4 + ... =~ 2n = O(n)。

类似地,如果每次运行花费时间 O(n log n),并且当 n > 1 时以 size floor(n/2) 的额外运行,总时间为 O(n log n)。

【讨论】:

    【解决方案2】:

    由于问题的大小在每次迭代中减半并且在每个级别所花费的时间为n log n,因此递归关系为

    T(n) = T(n/2) + n log n
    

    应用大师定理,

    T(n) = a T(n/b) + f(n) 相比,我们有 a=1 和 b=2。

    因此 nlogba = nlog21 = n0 = 1.

    因此 f(n) = n log n > nlogba.

    应用主定理,我们得到 T(n) = Θ(f(n)) = Θ(n log n)。

    因此复杂度为 T(n) = Θ(n log n)

    【讨论】:

      【解决方案3】:

      在 cmets 之后编辑:

      如果每次运行时问题的大小减半,您将运行 log(n) 次来完成它。由于每次运行都需要 n*log(n) 时间,因此您将有 log(n) 次 n*log(n) 运行。总复杂度为:

      O(n log(n)^2)
      

      【讨论】:

      • 没有。 n 在每次“运行”时除以 2。
      • 但是为什么n每次减半都是n呢?
      【解决方案4】:

      如果我没有误解这个问题,第一次运行会在(与)nlogn 中完成。第二次运行只剩下 n/2,所以在 n/2log(n/2) 中完成,以此类推。

      对于较大的 n,这是您在分析时间复杂度时假设的,log(n/2) = (logn - log2) 将替换为 logn。

      总结“所有”步骤: log(n) * (n + n/2 + n/4 ...) = 2n log(n),即时间复杂度nlogn

      换句话说:时间复杂度与您的第一步/基本步骤相同,所有其他步骤“仅”再次贡献相同数量

      【讨论】:

        【解决方案5】:

        我很确定 O(n^2 log n)。您创建了一个 n + n/2 + n/4 + ... = 2n 的几何级数(对于大 n)。但是你忽略系数,只得到 n。

        这很好,除非您的意思是内部 nlogn 与外部 n 的 n 值相同。

        编辑: 我认为 OP 在这里的意思是每次运行内部 nlogn 也会被砍掉。换句话说,

        nlogn + n/2 log n/2 + n/4 log n/4 + ... + n/2^(n - 1) log n/2^(n-1)

        如果是这种情况,那么需要考虑的一件事是在某个时候

        2^(n-1) > n

        此时日志发生故障(因为 0 到 1 之间的数字的日志为负数)。但是,您并不真正需要日志,因为在这些迭代中只有 1 次操作。因此,从那里开始,您只需添加 1。

        这发生在 log n / log 2 处。因此,对于第一个 log n / log 2 迭代,我们得到了上面的总和,之后它只是 1s 的总和。

        nlogn + n/2 log n/2 + n/4 log n/4 + ... + n/2^(log n / log 2) log n/2^(log n / log 2) + 1 + 1 + 1 + 1 ... (n - log n / log 2) 次

        不幸的是,这个表达式并不容易简化......

        【讨论】:

        • 你从哪里得到的 n^2?
        • n ( n log n ) = n^2 log n.
        • 那你为什么要乘n呢?
        • 我描述的几何级数给你一个 2n,但对于 O 计算,你放弃 2 并只使用 n。我刚刚更新了帖子,因为我认为我对这个问题的最初理解不是 OP 的意思。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 1970-01-01
        • 2015-12-19
        • 2021-06-22
        • 2011-07-09
        • 1970-01-01
        相关资源
        最近更新 更多