【问题标题】:Provide an algorithm O(n^3 log n) with simple operations?提供一个运算简单的算法 O(n^3 log n)?
【发布时间】:2013-08-22 06:23:28
【问题描述】:

提供一个算法计算性能O(n3 log n)。该算法应该只包含简单的操作。

知道如何解决这个问题吗?...我正在攻读计算机科学 GRE。谢谢!

【问题讨论】:

    标签: algorithm big-o time-complexity asymptotic-complexity


    【解决方案1】:

    一种方法是编写一个运行 O(n3) 次的外循环和一个运行 O(log n) 次的内循环:

    for (int i = 0; i < n * n * n; i++) {
       for (int j = 1; j <= n; j *= 2) {
           // ... do nothing ... //
       }
    }
    

    请注意,内部循环运行 log n 次,因为在循环 k 次迭代后 j 的值为 2k,并且只要 k ≥ lg n,我们就会有 j = 2 k ≥ n.

    另一种选择是编写一个递归函数,其运行时间通过Master Theorem 计算为 O(n3 log n)。一种方法是使用一个函数对大小为 n / 2 的子问题进行 8 次递归调用,并且每次调用都进行 Θ(n3) 工作:

    void silly(int n) {
        if (n > 0) {
            for (int i = 0; i < n * n * n; i++) {
                // ... waste time ... //
            }
            for (int i = 0; i < 8; i++) {
                silly(n / 2);
            }
        }
    }
    

    编辑:正如@Nuclearman 所指出的,您还可以通过对大小为 n3 的数组进行排序来获得运行时 O(n3 log n) sup> 使用快速排序或堆排序等算法。更一般地,在大小为 n3 的输入上运行运行时间为 O(n log n) 的任何算法都会产生 O(n3 log n) 的运行时间。这使用了 log (n3) = 3 log n = O(log n) 的事实。

    希望这会有所帮助!

    【讨论】:

    • 另一种可能性是对大小为 O(N^3) 的列表进行排序。
    • 我本来可以的,但既然你已经有了一个相当完整的答案,那么简单地帮助你的答案更完整似乎更好。
    • 似乎这是正确的做法,因为即使我来自那里,我也会忽略一般情况。
    【解决方案2】:

    您可以使用代数向后解决这个问题。

    递归 T(n^3/3) 算法为您提供 O(n^3),所以现在您只需要 T(n/2) 来记录日志。

    N 必须等于 K 才能工作

    过程T(n,k)是

    T(n^3/3,k) 如果 n >=0

    T(n,k/2) 如果 k>=0 且 n

    它将运行 O(n^3),然后是 O(log n),因此无论如何,这个程序的最小运行时间是 O(n^3 log n)

    我是如何获得 T 函数的值的?让我们从求解 T(n/2) 开始。

    T(n)=T(n/2)+1。加 1 是我们完成递归后基本操作需要多长时间。 T(n/2) = T(n/4) + 1 因此 T(n) = T(n/4) + 2

    我们可以推断出 T(n) = T(n/2^k) + k。

    T(1) 是我们的基本情况,所以让 n/2^k 等于 1 并求解 k。

    K = log n (base 2)

    所以这意味着这个函数有 O(log n) 的大 O。

    可以对 T(n^3/3) 进行相同的数学运算。

    如果这没有任何意义,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-23
      • 2015-06-12
      • 2011-04-07
      • 2021-09-25
      • 2015-12-03
      相关资源
      最近更新 更多