Scala 从StdIn读取输入,要求在运行时间方面提高性能,请求建议

Scala 从StdIn读取输入,要求在运行时间方面提高性能,请求建议,scala,scala-collections,Scala,Scala Collections,我正试图提交下面的scala解决方案在黑客地球记住我!。但是,由于超出了时间限制,因此不需要 关于如何提高运行时间有什么建议吗 我看到,随着输入的增加,使用定时器,循环中的readInt(第二个循环)需要更多的时间。。。。需要想法吗?我可以用其他方法来改进吗 import java.util.concurrent.TimeUnit import scala.collection.mutable.{ArrayBuffer, Map} import scala.io.StdIn.{readInt,

我正试图提交下面的scala解决方案在黑客地球记住我!。但是,由于超出了时间限制,因此不需要

关于如何提高运行时间有什么建议吗

我看到,随着输入的增加,使用定时器,循环中的readInt(第二个循环)需要更多的时间。。。。需要想法吗?我可以用其他方法来改进吗

import java.util.concurrent.TimeUnit

import scala.collection.mutable.{ArrayBuffer, Map}
import scala.io.StdIn.{readInt, readLine}

import scala.io.Source.stdin

object MemorizeMe {

  def main(args: Array[String]): Unit = {

    var inpLen = readInt()
    var inp = readLine().split(" ").map(_.toInt)

    val numQueries = readInt()
    var queryList = new ArrayBuffer[Int]

    var numsMap = Map[Int, Int]()
    time {for (i <- inp) if (numsMap.contains(i)) numsMap(i) = numsMap(i) + 1 else numsMap += (i -> 1)}

    time{for (i <- 1 to numQueries) queryList += readInt()}
    time{for(i <- queryList) if (numsMap.contains(i)) println(numsMap(i)) else println("NOT PRESENT")}

    /*for (x <- io.Source.stdin.getLines) {
      val i = x.toInt
      if (numsMap.contains(i)) println(numsMap(i)) else println("NOT PRESENT")
    }*/

  }

  def time[R](block: => R): R = {
    val t0 = System.nanoTime()
    val result = block    // call-by-name
    val t1 = System.nanoTime()
    println(TimeUnit.SECONDS.convert((t1 - t0), TimeUnit.NANOSECONDS) + "secs")
    result
  }

}
import java.util.concurrent.TimeUnit
导入scala.collection.mutable.{ArrayBuffer,Map}
导入scala.io.StdIn.{readInt,readLine}
导入scala.io.Source.stdin
对象记忆{
def main(参数:数组[字符串]):单位={
var inpLen=readInt()
var inp=readLine().split(“”.map(uu.toInt)
val numQueries=readInt()
var queryList=newarraybuffer[Int]
var nummap=Map[Int,Int]()
时间{for(i 1)}

时间{for(i您有关于将接收多少整数的信息。您可以使用该信息创建固定大小的
数组
,并将附录(
queryList+=readInt()
)更改为更新(
queryList(i)=readInt()


正如您可以在Scala doc()中找到的那样,追加成本是
aC
,同时更新成本是
C

未测试,但这应该可以工作:

val queryList = Array.fill(numQueries)(ReadInt())

这将分配一个大小正确的
数组
,然后为每个元素调用
ReadInt

您可以发布每个元素的时间测量值吗?当然,我会尝试这个想法,并让您知道……!虽然我会尝试这个建议,但是,由于从标准输入读取数据,我感觉实际时间越来越高,在每一个iTreation上…而不是数组附加…!@Raja您得到的时间度量是什么?只是为了理解我们在这里讨论的时间尺度。对于1000个数字,下面的for循环需要40秒。时间{(i@Raja您是否尝试过一次读取整个输入?而不是执行许多读取语句?这可能会大大提高性能。我在scala.io.Source.stdin.getlines()中看到了一个方法),但我找不到有关其用法的示例…或您可能有的任何其他想法…感谢您的回答。但不幸的是,这种方法没有减少程序所需的时间…它是否影响了此循环所需的时间?大部分时间都在哪里?我没有看到任何时间随着更改而改进。我看到大多数时间是在第二个循环中使用readInt方法。这是我试图解决的黑客问题。。。