Scala数据结构和复杂度O(1)

时间:2015-07-23 15:39:26

标签: scala data-structures

今天我接受了关于Scala的采访,请求是:

实现具有固定大小N的数据结构,具有以下功能:

  • 得到(指数)
  • 组(索引,值)
  • SETALL(值)

复杂性应为O(1)

example:
   val ds = DS(100)
   ds.set(4,5)
   ds.get(4) //would return  5
   ds.set(1,4)
   ds.setall(10)
   ds.get(4) //would return  10
   ds.get(7) //would return  10
   ds.set(1,7)
   ds.get(1) //would return  7

请查找我在下面发送的代码 我的问题是这是正确的解决方案吗?如果有更好的方法吗?

import scala.collection.mutable.HashMap

trait Operations {

  def get(index: Int): Int
  def set(index: Int, value: Int)
  def setall(value: Int)
}

class DS(N: Int) extends Operations {

  var myMutableHashMap = new HashMap[Int, Int]().withDefaultValue(0)

  def get(index: Int) = myMutableHashMap(index)

  def set(index: Int, value: Int) = {
    if (index <= N) myMutableHashMap += (index -> value)
  }

  def setall(value: Int) = {

    myMutableHashMap = new HashMap[Int, Int]().withDefaultValue(value)
  }

}

object Task {

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

    val ds = new DS(100)

    ds.set(4, 5)
    ds.get(4)

    println(ds.get(4)) // -> 5

    ds.setall(10)
    println(ds.get(4)) //-> 10
    println(ds.get(7)) //-> 10
    ds.set(1, 7)
    println(ds.get(1)) //-> 7

  }

}

1 个答案:

答案 0 :(得分:1)

我不确定它是否更好,但我认为HashMap可能有点矫枉过正。 以下解决方案可能占用空间更小,代码更少。 虽然,我可能宁愿实现更通用的东西,但它应该满足你提到的要求。

trait Operations {
  def get(index: Int): Int
  def set(index: Int, value: Int): Unit
  def setall(fill: Int): Unit
}

class DS(size: Int) extends Operations {
  val underlying: Array[Int] = new Array(size)

  def get(index: Int): Int = underlying(index)

  def set(index: Int, value: Int): Unit = underlying(index) = value

  def setall(fill: Int): Unit = (0 until size).foreach(underlying(_) = fill)
}

另类,这可能会给我们一个更好的&#39; setall&#39;复杂但需要付出代价...

trait Operations {
  def get(index: Int): Int
  def set(index: Int, value: Int): Unit
  def setall(fill: Int): Unit
}

class DS(size: Int) extends Operations {
  var underlying: Array[Integer] = new Array(size)
  var default: Integer = new Integer(0)

  def get(index: Int): Int = {
    val result = underlying(index)
    if (result == null) default else result
  }

  def set(index: Int, value: Int): Unit = underlying(index) = value

  def setall(fill: Int): Unit = {
    default = fill
    underlying = new Array(size)
  }
}