Scala链表***

Posted

技术标签:

【中文标题】Scala链表***【英文标题】:Scala linked list *** 【发布时间】:2011-05-08 20:41:18 【问题描述】:

使用 scala 我已将大约 100000 个节点添加到链表中。当我使用函数长度时,例如 mylist.length。我收到“java.lang.***Error”错误,我的列表是否需要处理?该列表只是字符串对象。

【问题讨论】:

【参考方案1】:

看来库实现不是尾递归override def length: Int = if (isEmpty) 0 else next.length + 1。似乎这可以在邮件列表中讨论,以检查是否应该打开增强票。

你可以这样计算长度:

def length[T](l:LinkedList[T], acc:Int=0): Int =
  if (l.isEmpty) acc else length(l.tail, acc + 1)

【讨论】:

我完全赞成增强票。这个方法可以很容易地以非递归方式实现,一直回到TraversableOnce。我什至可以在此注释行中实现它:def length: Int = var count = 0; foreach _ => count += 1 ; count 。回到LinearSeq,通过使用私有辅助方法使原始实现完全尾递归可以获得更好的性能。恕我直言,应该采取这两种方法。你打开它,还是我可以? @Daniel 请打开它,因为您可以提供比我更多的建议,就像您在这里所做的那样。【参考方案2】:

在 Scala 中,计算 List 的长度是一个 n 阶运算,因此您应该尽量避免它。您可能会考虑切换到数组,因为这是一个恒定时间操作。

【讨论】:

Vector 优于 Array【参考方案3】:

您可以尝试增加 JVM 可用的堆栈/堆大小。

scala JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" MyClass.scala

在哪里

-Xss<size>  maximum native stack size for any thread
-Xms<size>  set initial Java heap size
-Xmx<size>  set maximum Java heap size

This question 有更多信息。

另见This Scala document。

【讨论】:

你的意思是JAVA_OPTS="-Xmx512M -Xms16M -Xss16M" scala MyClass.scala?我的 shell 要求 JAVA_OPTS 在 scala 命令之前。【参考方案4】:

您能否确认您确实需要使用length 方法?听起来您可能没有为您的用例使用正确的集合类型(如果没有任何额外信息,很难判断)。列表经过优化,可以使用折叠或尾递归函数进行映射。

尽管如此,这绝对是一个疏忽,可以通过尾递归函数在标准库中轻松修复。希望我们能在 2.9.0 及时获得它。

【讨论】:

以上是关于Scala链表***的主要内容,如果未能解决你的问题,请参考以下文章

使用 scala 实现双向链表

3-单向链表-Scala实现

使用 scala 实现单向链表

使用 scala 实现单向链表

scala模拟链表并解答约瑟夫问题

如何把二叉树转换为双向链表