如何计算以下函数的时间和空间复杂度。

时间:2013-09-12 11:54:20

标签: performance algorithm time-complexity space-complexity

如何计算以下函数的时间和空间复杂度。 我试过,但由于递归函数调用我感到困惑。

public void readDirectory(File file){
    if(file.isDirectory()){
        File[] folder = file.listFiles();
        for (File f : folder) {
            readDirectory(f);
        }
    }else{
        if(file.getName().contains("(2)"))
            System.out.println(file.getName());
    }
}

2 个答案:

答案 0 :(得分:1)

时间= O(n)

  • 对于文件夹层次结构的每个级别,仅对该级别的项目执行for循环。如果文件系统中总共有n项(文件和文件夹),则每个文件夹中只有该数字的一部分,并且每个文件夹中的所有项目总计为{{1} }。在递归的每个级别,您都会进行线性遍历该级别,并为每个子级调用该函数。在执行每个级别之后,您仍然具有线性时间,因为对于您在线性时间内遍历的每个级别,只有所有文件的细分和所有细分总计为文件总数。

空格= O(n)

  • 同样,您有n空间复杂度,因为您为当前路径中的每个文件/文件夹分配了一个O(n)对象。它实际上等于文件夹层次结构的最大深度,因为您将File对象保持在每个级别,直到下一级递归调用完成,但仅在此之后释放它们。在最坏情况中,文件夹层次结构可以是File深 - 当每个子文件夹中只有1个子文件夹且没有文件时。这为您提供了O(n)空间复杂度

答案 1 :(得分:-1)

这是一个DFS。 时间复杂度为O(n)(您访问每个文件一次) 空格是folder变量的O(max {| directory |})。