【问题标题】:Scala List performanceScala 列表性能
【发布时间】:2013-06-04 09:06:26
【问题描述】:

有谁知道不同风格的 Scala 列表中“包含”方法的性能特征的来源? scala 语言文档涵盖了头、尾、追加等主要操作,但似乎没有涵盖“包含”的性能。 (或者至少我没有找到任何类似的东西。)

FWIW,我需要最快的结构来有效地告诉我一个元素是否存在于其列表中。该清单在最初编译后将不会进行任何进一步的 a/m/d 操作。

这是针对 Scala 版本 2.10.0

编辑:如果它应该有所不同,这是一个文本段列表(每个约 16 到 48 个字符。)并且,为了澄清,文档确实包含一个显示查找性能的小表 - 但对于只有一小部分列表/地图实现。

【问题讨论】:

  • 它必须是一个非常疯狂的列表,因为包含不是 O(n)。如果您想要快速包含,请使用 Set
  • 在查找方面,这张表无处不在。当然,其中大部分是哈希(根据之前的编辑),但我想确保有足够的差异:scala-lang.org/docu/files/collections-api/collections_40.html
  • 在大多数情况下,Scala 中只有一种“风格”的列表,List,这是一个经典的、功能性(类似 Lisp)基于 cons-cell 的列表。 Scala 的List 是具体类型,而Java 的List 是抽象类型。 Java 调用List Scala 调用Seq,这是所有集合的抽象类型,它们保持其条目的特定顺序与添加条目的顺序相同或相反。正如其他人指出的那样,您想要的是 Set,其确切目的是支持快速测试特定值的存在与否。

标签: performance list scala contains


【解决方案1】:

这似乎是一棵树的正确工作,在这种情况下为 RB 树,contains 执行的搜索在片段数量上执行对数。

由于您只需要检查遏制,您应该使用集合来进一步减少查找时间。

解决办法是TreeSet

【讨论】:

  • 出于好奇,我似乎有几个 scala 列表实现似乎结合了列表、数组等之间的并行功能......是否任何基本构造都使用树来实现 contains - 还是通过蛮力迭代完成的?
  • 迭代。无论如何,请注意RB树需要额外的内存来存储数据结构(每个节点至少一个颜色位和两个指针)。选择一个或另一个实际上取决于情况:RB 树更重,您只会在存储大量元素时才能感受到好处(我实际上并没有对此进行基准测试)。另请注意,列表可以保留插入顺序(如数组),而树则不能。
  • 为什么不是HashMap?它将提供O(1)/
  • 最佳情况。最坏的情况可能是 O(n)。 RB 树始终为 O(log(n))
  • Stefano,在您开始看到额外的组件重量开始带来性能回报之前,您是否对所需的元素数量有任何直觉。我知道这涉及很多因素,但我只是想大致了解一下。对于我的情况,我只处理不到 500 个左右的元素,但查找会非常频繁地进行。 (与筛选千万亿个元素相比,但只是不经常这样做。)
猜你喜欢
  • 2018-01-06
  • 2016-05-05
  • 2017-04-03
  • 2020-12-28
  • 2011-12-23
  • 2017-02-09
  • 2011-06-21
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多