我想知道为什么这个小程序需要O(N)才能继续

时间:2013-03-14 19:56:59

标签: java performance algorithm analysis recurrence

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)+(第2行)O(1)+(我们假设的子编号是N)N *(T(1)
2. T(0)=(第一行)O(1)+(第2行)O(1)+ N *(O(1)+ O(1)+ N *(T(2))
3随着这种感应的继续,运行时间将是某种O(N ^ 2)

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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