Java 将所有子目录中所有文件中的所有数字相加-复杂度?
给定根目录,逐行读取根目录或子目录中的所有文件,并将每个文件中的所有数字相加。每个文件的每一行都有一个数字。所以我只需要读取所有文件,将所有数字相加,然后返回。我想出了下面的代码,它做的工作,如果有任何更好或有效的方法,让我知道 我试图了解以下程序的复杂性。如果结构很深,我们在很多子目录中有很多文件,那么下面的程序的复杂性是什么。如果在面试中被问到,我们应该如何描述这种情况的复杂性Java 将所有子目录中所有文件中的所有数字相加-复杂度?,java,file,io,directory,time-complexity,Java,File,Io,Directory,Time Complexity,给定根目录,逐行读取根目录或子目录中的所有文件,并将每个文件中的所有数字相加。每个文件的每一行都有一个数字。所以我只需要读取所有文件,将所有数字相加,然后返回。我想出了下面的代码,它做的工作,如果有任何更好或有效的方法,让我知道 我试图了解以下程序的复杂性。如果结构很深,我们在很多子目录中有很多文件,那么下面的程序的复杂性是什么。如果在面试中被问到,我们应该如何描述这种情况的复杂性 private static int count = 0; public static void mai
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;
}
每行只执行一个计算步骤。算法是在其中n是所有文件中的行数。假设您有n个文件。因此,每个文件只访问一次。所以这一部分开始了。也就是说,m是该过程中可能出现的最大行数。每个文件中的每一行读取一次。所以,最坏的情况是,您将读取n个文件中的m行。所以,这就是*m。你可以把m看作是平均行数 之所以需要n和m,是因为有两个未知变量,文件数,不管它是否在一个文件夹中,格式化为每个目录中的一个文件和一个子目录,因为你要逐个访问,你需要访问所有文件,每个文件只访问一次,行数。它们每个都可以独立生长,因此它是两个未知函数的函数。因此,它在*m上
即使将所有行放在一个文件中,也会是Ofr,其中fr=gn*m,所以仍然是*m,其中r是行的总数r=n*m。其功能不同但顺序相同的原因,是由于通过文件夹和文件读取的启动因素,在算法开始之前应该定义一个常数,该常数不影响功能顺序。设m为文件和子目录的数量。设n为文件中的最大行数。复杂度是omn文件的数量和子目录的数量可以不同,所以我们是否需要同时使用m?也许要问一个非常基本的问题M是文件数++子目录数。为这件事道歉ambiguity@ggbranch它不会是2^n,因为我有递归函数调用?我只是因为这个才感到困惑。那么文件的数量或者子目录的数量呢?这不重要吗?如果文件或子目录的数量超过行数,即有很多空文件或目录没有文件,只有更多的子目录,那么n将成为文件或目录的数量。但它仍然是线性复杂度。