提问人:Louis Lac 提问时间:9/14/2020 最后编辑:Louis Lac 更新时间:10/7/2021 访问量:361
Swift 'compactMap' Sequence方法的时间复杂度
Time complexity of Swift 'compactMap' Sequence's method
问:
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)
答:
3赞
Dávid Pásztor
9/14/2020
#1
该文档实际上并没有说明这是算法的时间还是内存复杂性。
然而,时间复杂度确实是,内存复杂度是 ,因为原始大小保留在内存中,同时还创建了新的大小。O(n)
O(n+m)
Sequence
n
Array
m
评论
1赞
Louis Lac
9/14/2020
既然 m <= n,它不应该只是吗?为什么要像这样混合内存和时间复杂度?这使得理解文档变得困难。 还为 result 分配了一个新的数组,但其复杂性被宣传为 。O(n)
filter
O(n)
0赞
Alexander
9/14/2020
这并不完全正确,因为 正在流式传输到数组中,但其元素不是单独存储的。此外,复杂性分析通常省略输入的大小。Sequence
0赞
Louis Lac
9/14/2020
是的,我读到这是一个消费函数(这是你所说的“流”的意思吗?),所以创建和使用迭代器,但对于 a,行为应该与复杂性几乎相同?filter
Collection
compactMap
评论
flatMap(_:)
O(self.count)