给出一个根目录,逐行读取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;
}
答案 0 :(得分:1)
假设您有n
个文件。因此,您访问每个文件一次。所以那部分是O(n)
。假设m
是该过程中出现的最大行数。您读取每个文件中的每一行一次。因此,最坏的情况是您将读取m
文件中的n
行。因此,它成为O(n*m)
。您甚至可以将m
视为平均行数。
之所以需要同时拥有n和m是因为您有两个未知变量,即文件数(它在一个文件夹中的格式为一个文件,在每个目录中的一个子目录中都没有关系,因为您一个接一个地访问,需要全部访问,并且只能访问一次,并且访问行数,每行都可以独立增长,因此它具有两个未知函数,因此称为O(n*m)
。
即使将所有行放在一个文件中,也将是O(f(r))
,其中f(r)=g(n*m)
,所以仍然是O(n*m)
,其中r是总行数({{ 1}})。其功能不同但顺序仍然相同的原因是由于行进槽文件夹和文件读取启动的因素,在算法启动之前应将其定义为一个常数,而不会影响功能的顺序。
答案 1 :(得分:0)
每行您仍然只执行一个计算步骤。算法为O(n)
,其中n
是所有文件中的行数。