遍历列表时出现奇怪的性能行为

时间:2014-07-15 18:07:42

标签: scala

以下代码会产生一些奇怪的结果:

object Solution {
  def main(args: Array[String]) {
    var start = System.currentTimeMillis()
    val nums = io.Source.fromFile("C:\\Users\\Sagi\\Desktop\\input.txt") /*stdin*/ .getLines().toList drop 1 map (_ toInt)
    val k = (nums take 1)(0)
    val sorted = (nums drop 1).sorted
    println(System.currentTimeMillis() - start)
    start = System.currentTimeMillis()
    var unifairness = Int.MaxValue
    for(i <- 0 until (sorted.length - k);
      diff = sorted(i + k - 1) - sorted(i)
      if diff < unifairness
    ) unifairness = diff
    println(System.currentTimeMillis() - start)
    println(unifairness)
  }
}

奇怪的是,我的机器上的第一次打印时间少于一秒,并且运行已排序,需要O(NlogN)第二次打印需要20-30秒,并且应该在O(N)中运行

BTW我尝试在排序列表上使用.view.force,尝试了一个while循环,我还尝试使用@tailrec进行递归遍历以进行堆栈空间优化

输入文件只是一个100,000行的文本文件,每行有一个整数

有人可以在这里解释我做错了什么吗?

1 个答案:

答案 0 :(得分:5)

List是O(n),用于按索引进行随机访问,而不是O(1)。您需要扩展IndexedSeq的内容,例如VectorArray 1 。方法toVectortoArray可用于TraversableOnce的所有实例(因此SeqIterator的所有实例),就像toList一样工作

1 Array实际上不是IndexedSeq,但必要时会通过WrappedArray将其转换为一个。)