Scala:查找子列表的最大元素

时间:2014-04-01 21:42:42

标签: scala

我需要编写一个函数,它接受List[Int],起始索引和结束索引,并返回该范围内的max元素。我有一个有效的递归解决方案,但我想知道是否可以使用Scala集合库中的内置函数来实现它。

其他标准是:

1)O(N)运行时间 2)没有中间结构创建 3)没有可变数据结构

def sum(input:List[Int],startIndex:Int,endIndex:Int): Int = ???

2 个答案:

答案 0 :(得分:2)

使用Scala的观点很容易实现这一点:

def subListMax[A](list: List[A], start: Int, end: Int)(implicit cmp: Ordering[A]): A =
  list.view(start, end).max

view不会创建中间数据结构,它只提供原始切片的切片。请参阅Scala集合库文档中的Views chapter

答案 1 :(得分:0)

我认为你的标准是不可能的。

我没有更高级的函数,它可以在列表的子列表中运行。许多人只是创建中间集合。

这将是一个简单的O(n)解决方案,但它会创建一个中间结构。

input.slice(startIndex, endIndex + 1).max

当然还有函数,它遍历集合并产生值。示例包括reducefoldLeft。问题在于它们遍历整个集合,您无法设置开始或结束。

您可以从startIndex迭代到endIndex并在其上使用foldLeft通过索引获取值。一个例子是:

(startIndex to endIndex).foldLeft(Integer.MIN_VALUE)((curmax, i) => input(i).max(curmax))

这里我们只有一个迭代器,它基本上表现得像for-loop并且不会产生繁重的中间集合。但是,从startIndexendIndex的迭代为O(n),并且在每次迭代时,我们都有一个索引操作(input(i)),O(n)通常List }。最后,sum不会是O(n)

这当然只是我对scala的经历,也许我被误导了。

啊,你的3):我不确定你的意思。在函数内使用可变状态应该不是问题,因为它只存在于计算结果然后消失。