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

时间:2017-03-20 20:50:09

标签: java algorithm random 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;      
}

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

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

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

@Edit

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

1 个答案:

答案 0 :(得分: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. 其他数组元素选择一个随机数。
  6. 要覆盖无偏见的文件,请在文件末尾添加10个foobar名称,如果选择了该名称,则重复该过程。