处理大文本文件需要多长时间?

Moi*_*Col 1 java random algorithm big-o

我有一个包含名字的大文本文件.

目标是生成随机名称(文件中的两个随机名称).

考虑到该文件有大约8k行,每行一个名称,尝试从该文件中获取随机行是否有效处理器?这是一个漫长的过程,因此在运行时有用吗?

我打算使用以下方法获取随机名称

 public static String choose(File f) throws FileNotFoundException
 {
 String result = null;
 Random rand = new Random();
 int n = 0;
 for(Scanner sc = new Scanner(f); sc.hasNext(); )
 {
    ++n;
    String line = sc.nextLine();
    if(rand.nextInt(n) == 0)
       result = line;         
 }

 return result;      
}
Run Code Online (Sandbox Code Playgroud)

对这段代码的新手分析让我觉得它在大约O(n)时间内运行

但是我用较少数量的字符串测试它(原始文件目前尚未完成,大约150个名称用于测试目的).

这是生成随机名称的有效方法吗?

@编辑

考虑到我想在很短的时间内生成名称,效率很重要.

Tom*_* F. 5

这取决于您是否要重复使用您的函数(生成许多随机名称).如果不是,则在文件大小内生成随机数,跳到相应的字节,找到以get行结尾的最近行.

有关'RandomAccessFle'的帮助,请查看:https://bitsofinfo.wordpress.com/2009/04/15/how-to-read-a-specific-line-from-a-very-large-file-in-java/

如果需要生成许多随机名称,请将整个文件读取到ArrayList(8k远远不够).

-------修改了btilly的想法

  1. 生成随机数
  2. 从该点读取固定长度的字符以覆盖大约5-10个名称(行)
  3. 将内容拆分为'\n'以创建行内容数组
  4. [0]和[n-1]个元素将不完整
  5. 其他数组元素的选择是随机的.

要覆盖没有偏见的文件结尾,请在文件末尾添加10个foobar名称,如果选择了该名称,则重复该过程.