java对所有子目录中所有文件中的所有数字求和复杂度?
给定根目录,逐行读取rootDirectory
或子目录中的所有文件,并将每个文件中的所有数字相加。每个文件的每一行都有一个数字。所以我只需要读取所有文件,将所有数字相加,然后返回。我想出了下面的代码,它做的工作(如果有任何更好或有效的方法,让我知道)
我试图了解以下程序的复杂性。如果结构很深,我们在很多子目录中有很多文件,那么下面的程序的复杂性是什么。如果在面试中被问到,我们应该如何描述这种情况的复杂性
private static int count = 0;
public static void main(String[] args) {
System.out.println(sumNumbersInFile("/home/david"));
}
private static int sumNumbersInFile(String rootDirectory) {
if (rootDirectory == null || rootDirectory.isEmpty()) {
return 0;
}
File file = new File(rootDirectory);
for (File fileEntry : file.listFiles()) {
if (fileEntry.isDirectory()) {
count += sumNumbersInFile(fileEntry.getName());
} else {
try (BufferedReader br = new BufferedReader(new FileReader(fileEntry))) {
String line;
while ((line = br.readLine()) != null) {
count += Integer.parseInt(line);
}
} catch (NumberFormatException | IOException e) {
e.printStackTrace();
}
}
}
return count;
}
# 1 楼答案
每行只执行一个计算步骤。算法是
O(n)
,其中n
是所有文件中的行数# 2 楼答案
假设您有
n
个文件。因此,每个文件只访问一次。所以那部分是O(n)
。比如说,m
是该进程中可能出现的最大行数。每个文件中的每一行读取一次。所以,最坏的情况是您将读取n
文件中的m
行。所以,这就是O(n*m)
。您可以将m
视为平均行数之所以需要n和m,是因为有两个未知变量,文件的数量(不管它是否在其上的一个文件夹中,格式化为每个目录中的一个文件和一个子目录,因为您逐个访问,您需要访问所有文件,并且每个文件只访问一次,以及行数。每个文件都可以独立增长,因此它是两个未知函数。因此,它的
O(n*m)
即使将所有行放在一个文件中,也将是
O(f(r))
,其中f(r)=g(n*m)
,因此仍然是O(n*m)
,其中r是行的总数(r = n * m
)。其功能不同,但顺序相同的原因,是由于通过文件夹和文件读取的启动因素,在算法开始之前应该定义一些常量,这不影响功能的顺序