【问题标题】:Performance of tail function for Scala ArraysScala 数组尾函数的性能
【发布时间】:2018-01-10 03:38:37
【问题描述】:

Scala docs 表示 tail 对于 Array 序列的性能是 Linearhead 性能是 Constant。由于包含数组元素的整个块被带到缓存中,我不希望看到数组的头和尾之间有任何区别。如果有人解释为什么 Scala 中数组的尾部性能是线性的,我将不胜感激。

【问题讨论】:

    标签: arrays scala performance


    【解决方案1】:

    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)

    【讨论】:

      【解决方案2】:

      listsarrays 之间有很大的区别。 headtail 是列表的规范接口,在 Scala 中,列表是单链表。 head 指的是列表中的第一个元素,tail 指的是第一个元素之后的所有元素。由于链表将尾部实现为指针,因此该操作是一个常数时间操作。

      但是,数组的情况有些不同。数组用于快速随机访问,指的是连续的内存块。 Scala 仍然公开headtail 的类似列表的接口,但它必须做一些不同的事情来模拟它。为了模拟tail,它必须创建一个包含除第一个之外的所有元素的新数组。它必须将其所有值复制到一个新数组中,这是一个线性时间操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-23
        • 2021-01-25
        • 1970-01-01
        • 2014-07-17
        • 2016-01-21
        • 2014-03-28
        相关资源
        最近更新 更多