Scala 从StdIn读取输入,要求在运行时间方面提高性能,请求建议
我正试图提交下面的scala解决方案在黑客地球记住我!。但是,由于超出了时间限制,因此不需要 关于如何提高运行时间有什么建议吗 我看到,随着输入的增加,使用定时器,循环中的readInt(第二个循环)需要更多的时间。。。。需要想法吗?我可以用其他方法来改进吗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,
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方法。这是我试图解决的黑客问题。。。