performance - 为什么 Map 实现应该覆盖 foreach?

标签 performance algorithm scala dictionary

documentation对于 scala.collection.mutable.Map 来说。

It is also good idea to override methods foreach and size for efficiency.

覆盖size(可能)是O(n)O(1)的改进。

但是重写 foreach 的值(value)是什么?

最佳答案

scala.collection.immutable.MapLike 中 foreach 的默认实现使用迭代器来实现 foreach。此实现继承自 IterableLike

def foreach[U](f: A => U): Unit =
  iterator.foreach(f)

但是实现迭代器通常比实现 foreach 复杂得多。迭代器必须显式地跟踪当前位置,这需要状态,并且在树状结构的情况下可能需要大量逻辑,例如什么用于不可变的 HashMap。以下是当前集合库中不可变 HashMap 和 HashSet 的迭代器作为示例 TrieIterator 。并不简单,对吧?

另一方面,foreach 方法使用调用堆栈来跟踪当前位置,因此实现起来非常简单且高效。二叉树的 foreach 方法就是 left.foreach(f); right.foreach(f)。

因此,根据映射的迭代器的复杂程度,单独实现 foreach 可能确实是一个好主意,以提高性能。

关于performance - 为什么 Map 实现应该覆盖 foreach?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20724733/

相关文章:

performance - 未知算法的大O

objective-c - NSMutableDictionary 用于巨大的 float 数据集

algorithm - 试图了解一类SVM

performance - 从 if 语句提前返回或从这两种情况返回之间有区别吗?

android - 可见性设置为 "gone"的 View 是否是测量和布局过程的一部分?

c - 如何在C中使用水库采样实现随机选择树节点的功能

java - 如何找到 TRIE 中最长的字符串

JsonSyntaxException Gson : Expected BEGIN_OBJECT but was STRING

scala - 具有最大位数的字符串格式

scala - 连接 hive 和spark时发生异常HDFS上的根暂存目录:/tmp/hive应该是可写的。当前权限是:rwxrwxr-x