Swift 'compactMap' Sequence方法的时间复杂度

Time complexity of Swift 'compactMap' Sequence's method

提问人:Louis Lac 提问时间:9/14/2020 最后编辑:Louis Lac 更新时间:10/7/2021 访问量:361

问:

Swift 文档指出,排序方法具有时间复杂度,其中 n 是序列的长度,m 是结果的长度。compactMap()O(n + m)

但是,在查看标准库中的实现时,我不明白为什么:

public func _compactMap<ElementOfResult>(
    _ transform: (Element) throws -> ElementOfResult?
  ) rethrows -> [ElementOfResult] {
    var result: [ElementOfResult] = []
    for element in self {
      if let newElement = try transform(element) {
        result.append(newElement)
      }
    }
    return result
  }

序列元素上只有一个循环,它应该是 。O(n)

快速 序列

评论

1赞 Alexander 9/14/2020
我认为这可能是从 .你是对的,因为它应该在时间和空间上。flatMap(_:)O(self.count)
0赞 9/14/2020
评论和结构化文档中的任何内容目前都是不可信的;编译器不检查它。预计这将是下一波编程语言的决定性变化。

答:

3赞 Dávid Pásztor 9/14/2020 #1

该文档实际上并没有说明这是算法的时间还是内存复杂性

然而,时间复杂度确实是,内存复杂度是 ,因为原始大小保留在内存中,同时还创建了新的大小。O(n)O(n+m)SequencenArraym

评论

1赞 Louis Lac 9/14/2020
既然 m <= n,它不应该只是吗?为什么要像这样混合内存和时间复杂度?这使得理解文档变得困难。 还为 result 分配了一个新的数组,但其复杂性被宣传为 。O(n)filterO(n)
0赞 Alexander 9/14/2020
这并不完全正确,因为 正在流式传输到数组中,但其元素不是单独存储的。此外,复杂性分析通常省略输入的大小。Sequence
0赞 Louis Lac 9/14/2020
是的,我读到这是一个消费函数(这是你所说的“流”的意思吗?),所以创建和使用迭代器,但对于 a,行为应该与复杂性几乎相同?filterCollectioncompactMap