有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
  }

共 (2) 个答案

  1. # 1 楼答案

    每行只执行一个计算步骤。算法是O(n),其中n是所有文件中的行数

  2. # 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)。其功能不同,但顺序相同的原因,是由于通过文件夹和文件读取的启动因素,在算法开始之前应该定义一些常量,这不影响功能的顺序