以下代码会产生一些奇怪的结果:
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行的文本文件,每行有一个整数
有人可以在这里解释我做错了什么吗?
答案 0 :(得分:5)
List
是O(n),用于按索引进行随机访问,而不是O(1)。您需要扩展IndexedSeq
的内容,例如Vector
或Array
1 。方法toVector
和toArray
可用于TraversableOnce
的所有实例(因此Seq
或Iterator
的所有实例),就像toList
一样工作
( 1 Array
实际上不是IndexedSeq
,但必要时会通过WrappedArray
将其转换为一个。)