suffix(from:) 和 dropFirst(_:) 之间有什么区别吗?

2024-02-11

我突然想到,在 Swift 中处理子序列时,

func suffix(from: Int)似乎与刚才相同dropFirst(_:)(显然,对于长度为“10”的数组,只需将输入值从“3”更改为“7”即可。)

只是重复一遍。所以:当然,对于一系列的说法长十.我的意思是func suffix(from: Int)与“2”相同dropFirst(_:)与“8”, 例如。

相似地upTo / through似乎与dropLast(_:)

除了方便以外有什么不同吗?

(也许是在错误条件、性能或?)

我想知道,事实上,在 Swift 内部,一个或另一个是否只是通过调用另一个来实现的?


他们是完全不同的。

  • suffix(from:) https://developer.apple.com/reference/swift/collection/1641372-suffix

    • 定义为Collection https://developer.apple.com/reference/swift/collection协议。
    • 返回一个Subsequence https://developer.apple.com/reference/swift/collection/subsequence从给定的开始Index https://developer.apple.com/reference/swift/indexablebase/index.
    • 记录的时间复杂度为 O(1)(您可以在这里查看它的默认实现 https://github.com/apple/swift/blob/master/stdlib/public/core/Collection.swift#L1486).
    • 如果您传递的索引超出范围,则会出现运行时错误。
  • dropFirst(_:) https://developer.apple.com/reference/swift/sequence/1641666-dropfirst

    • 定义为Sequence https://developer.apple.com/reference/swift/sequence协议。
    • 返回一个SubSequence https://developer.apple.com/reference/swift/sequence/subsequence具有给定的最大值元素数量从序列的头部删除。
    • 记录的时间复杂度为 O(n)*。虽然它的默认实现 https://github.com/apple/swift/blob/master/stdlib/public/core/Sequence.swift#L1157实际上时间复杂度为 O(1),这只是推迟了 O(n) 遍历删除元素直到迭代。
    • 如果您输入的数字大于序列的长度,则返回空子序列。

*与记录时间复杂度的所有协议要求一样,符合类型可以具有较低时间复杂度的实现。例如,一个RandomAccessCollection https://developer.apple.com/reference/swift/randomaccesscollection/'s dropFirst(_:)方法将在 O(1) 时间内运行。


然而,当谈到Array,这些方法只是happen行为相同(除了处理超出范围的输入)。

这是因为Array has an Index类型的Int0并依次计数至array.count - 1,因此意味着第一个子序列n丢弃的元素是相同的子序列从索引开始n.

也因为Array is a RandomAccessCollection,这两种方法都将在 O(1) 时间内运行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

suffix(from:) 和 dropFirst(_:) 之间有什么区别吗? 的相关文章

随机推荐