【问题标题】:I am wondering why this small program takes O(N) to proceed我想知道为什么这个小程序需要 O(N) 才能继续
【发布时间】:2013-03-14 19:56:59
【问题描述】:
private void listAll( int depth )
{
    printName( depth ); // Print the name of the object
    if( isDirectory( ) )
    for each file c in this directory (for each child)
    c.listAll( depth + 1 );
}

我尝试使用递归关系来诱导运行时间
正确的运行时间是 O(N)
我的分析表明它将是 O(N^2)

这是我的归纳
1. T(0) = (第一行) O(1)+(第二行) O(1)+(我们假设的孩子数是N) N*(T(1)
2. T(0) = (第一行) O(1)+(第二行) O(1)+ N*(O(1)+O(1)+ N*(T(2))
3 随着这种归纳的进行,运行时间将是某种 O(N^2)

我的分析有什么问题???

【问题讨论】:

  • 你是如何计算你的运行时间的?
  • 为什么会是指数级的?有 N 个文件。
  • 这里的N 是什么?
  • 看起来你在 T(1) 方面找到 T(0),然后在 T(2) 方面,等等。但这不是倒退吗?难道你不应该根据 T(0) 找到 T(1),并根据 T(1) 和/或 T(0) 找到 T(2) 吗?
  • N 乘以 N 的部分。里面没有说“对于每个 N,我们必须运行 N 次”;你永远不会重复任何事情。

标签: java performance algorithm analysis recurrence


【解决方案1】:

你的错误在于假设有 N 个孩子。如果 N 是文件总数,您应该观察 O(N) 运行时间。

【讨论】:

    【解决方案2】:

    您可能误解了 N 的含义?也许N是根目录及其所有子目录中所有文件的数量,这会使这个问题深度优先搜索,具有O(N)复杂度,其中N是节点数。

    如果确实是 N^2,那么一个目录中的文件数和另一个目录中的文件数必须具有某种依赖性。但事实并非如此......每个文件夹中的文件数量是不确定的,除非您实际访问它。可以是2,也可以是一万。

    【讨论】:

      【解决方案3】:

      如果单步是指对listAll()N 的一次调用是目录结构中元素的总数,则必须是对listAll() 的一次调用必须对应于单个元素,否则你会得到至少一个元素被打印了不止一次。

      因此,您会得到 O(N)(实际上,正好是 N * recursive_call_cost)

      【讨论】:

        猜你喜欢
        • 2010-10-13
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 2010-09-17
        • 1970-01-01
        相关资源
        最近更新 更多