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)
我的分析中有什么问题???
答案 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)