【问题标题】:Read input from StdIn, Require performance improvemnent with respect to run time, request suggestions从 StdIn 读取输入,要求在运行时提高性能,请求建议
【发布时间】:2019-12-19 00:57:23
【问题描述】:

我正在尝试在黑客地球中提交以下 scala 解决方案,记住我!。但是,由于超出了时间限制,它没有被占用。

关于如何提高运行时间的任何建议?

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

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
  }

}

【问题讨论】:

  • 你能发布你得到的每个时间测量吗?

标签: scala scala-collections


【解决方案1】:

您有关于您将收到多少个整数的信息。您可以使用该信息创建一个固定大小的 Array,并将附加 (queryList += readInt()) 更改为更新 (queryList(i) = readInt())。

您可以在 Scala 文档 (https://docs.scala-lang.org/overviews/collections/performance-characteristics.html) 中找到附加成本为 aC,同时更新成本为 C

【讨论】:

  • 当然,我会尝试这个想法,并让你知道....!虽然我会尝试这个建议,但是,由于每次迭代都从 StdIn 读取输入,我觉得实际时间变长了......而不是数组追加......!
  • @Raja 你得到的时间测量是多少?只是为了理解我们在这里谈论的时间尺度。
  • 对于 1000 个数字,下面的 for 循环需要 40 秒。 time{for (i
  • @Raja 您是否尝试过一次读取整个输入?而不是做很多读取语句?这可能会大大提高性能
  • 我在 scala.io.Source.stdin.getlines() 中看到了一个方法,但我找不到有关其用法的示例.....或您可能有的任何其他想法.. ..
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回复。但是,不幸的是,这种方法并没有减少程序花费的时间......
  • 它是否影响了此循环所用的时间?大部分时间都去哪儿了?
  • 我没有看到任何时间随着更改而有所改善。我看到大部分时间都在 readInt 方法中进行第二次循环。
  • 这是我要解决的hackerearth问题...hackerearth.com/practice/data-structures/arrays/1-d/…
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
相关资源
最近更新 更多