【问题标题】:Swift Array reversed() function O(1) complexity?Swift Array reversed() 函数 O(1) 复杂度?
【发布时间】:2017-10-07 23:46:09
【问题描述】:

我们可以在 Swift 中使用 reversed 函数来反转一个数组,下面是例子:

let numbers = [3, 5, 7]
let reversedNumbers = Array(numbers.reversed())
print(reversedNumbers)
// Prints "[7, 5, 3]"

这是链接:Array reversed()

在讨论部分的最后,它说复杂度 O(1),我相信这是关于时间复杂度的,如何反转一个数组需要 O(1) 时间?

【问题讨论】:

  • 如果您阅读了该页面上的所有文字,您会注意到reversed 提供了数组的反向视图。它不会反转数组,也不会创建一个新数组。
  • 它返回一个ReversedRandomAccessCollection,它只是底层数组的一个反向视图(比较stackoverflow.com/q/39547399/2976878)。但是说Array(numbers.reversed()) 将通过遍历该视图创建一个新数组,O(n) 也是如此。
  • @Hamish,@Molbdnilo 谢谢。明白了。

标签: arrays swift reverse


【解决方案1】:

实际上 reversed() 返回一个对象,其中包含原始数组的包装器,而不是内容的实际还原,因此 O(1)

如果您检查reversed() 调用的返回类型,它是ReversedCollection,它在内部将原始集合保持为_base,除非其内容被修改。基本上ReversedCollection 只是以相反的方式呈现/返回其基本集合的元素以节省时间内存

以下示例显示,除非修改,否则反转数组与原始数组保持相同:

var originalArray = [1, 2, 3]
var reversedArray = originalArray.reversed()

print("0th index of OriginalArray \(originalArray[0])")
print("0th index of ReversedBaseArray \(reversedArray._base[0])")


print("0th index of OriginalArray \(originalArray.first)")
print("0th index of ReversedBaseArray \(reversedArray.first)")

originalArray[0] = 4 // Modification makes a separate copy of each instance
print("0th index of OriginalArray \(originalArray[1])")
print("0th index of ReversedBaseArray \(reversedArray._base[1])")


// Console Output:
// 0th index of OriginalArray 1
// 0th index of ReversedBaseArray 1


// First element of OriginalArray Optional(1)
// First element of ReversedBaseArray Optional(3)


// 0th index of OriginalArray 4
// 0th index of ReversedBaseArray 1

【讨论】:

  • 不幸的是,这似乎不适用于直接索引,这令人困惑。例如,如果你说array.reversed()[1],你就会失去效率。
  • 直接索引只是为了理解下面的概念。
  • 这不是对代码的批评,而是对方法的可悲事实。
  • 参见stackoverflow.com/questions/68332664/…,我们刚刚讨论过这个问题。我到达了您的答案以寻求有关此问题的帮助。我没有得到任何东西。 :)
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 2017-09-01
相关资源
最近更新 更多