【发布时间】:2018-01-10 03:38:37
【问题描述】:
Scala docs 表示 tail 对于 Array 序列的性能是 Linear 而 head 性能是 Constant。由于包含数组元素的整个块被带到缓存中,我不希望看到数组的头和尾之间有任何区别。如果有人解释为什么 Scala 中数组的尾部性能是线性的,我将不胜感激。
【问题讨论】:
标签: arrays scala performance
Scala docs 表示 tail 对于 Array 序列的性能是 Linear 而 head 性能是 Constant。由于包含数组元素的整个块被带到缓存中,我不希望看到数组的头和尾之间有任何区别。如果有人解释为什么 Scala 中数组的尾部性能是线性的,我将不胜感激。
【问题讨论】:
标签: arrays scala performance
tail 函数创建一个包含除第一个元素之外的所有元素的新数组。为此,我们需要创建数组的副本(减去第一个元素),这是一个线性时间操作。随着数组变大,要复制的内容也越来越多。
如果您需要高效的头尾操作,请改用List。
您可能会将 tail 与 last 混淆
head 获取第一个元素:O(1) for List and Array last 获取最后一个元素:O(n) 用于 List,O(1) 用于 Array tail 获取除第一个之外的所有内容:O(1) 用于 List,O(n) 用于 Array init 获取除最后一个之外的所有内容:列表和数组的 O(n) 【讨论】:
lists 和 arrays 之间有很大的区别。 head 和 tail 是列表的规范接口,在 Scala 中,列表是单链表。 head 指的是列表中的第一个元素,tail 指的是第一个元素之后的所有元素。由于链表将尾部实现为指针,因此该操作是一个常数时间操作。
但是,数组的情况有些不同。数组用于快速随机访问,指的是连续的内存块。 Scala 仍然公开head 和tail 的类似列表的接口,但它必须做一些不同的事情来模拟它。为了模拟tail,它必须创建一个包含除第一个之外的所有元素的新数组。它必须将其所有值复制到一个新数组中,这是一个线性时间操作。
【讨论】: