我从我的数据库中获取数据的方式与我需要的方式相反。为了正确地命令它我有几个选择:我可以插入在我的数组的索引0处获得的每个新数据,或者只是追加它然后在最后反转数组。像这样:
let data = ["data1", "data2", "data3", "data4", "data5", "data6"]
var reversedArray = [String]()
for var item in data {
reversedArray.insert(item, 0)
}
// OR
reversedArray = data.reverse()
这些选项中的哪一个会更快?随着项目数量的增加,2之间是否会有任何显着差异?
答案 0 :(得分:7)
追加新元素的摊销复杂度大致为O(1)。根据文档,反转数组也有constant complexity。
插入有一个complexity O(n),其中n是数组的长度,您将逐个插入所有元素。
所以追加然后逆转应该更快。但如果你只处理几十个元素,你就不会看到明显的差异。
答案 1 :(得分:2)
通过在开头重复插入项目来创建数组将是最慢的,因为它需要的时间与所涉及的项目数的平方成比例。
(澄清:我的意思是构建整个数组反转将需要时间与n ^ 2成比例,因为每个插入将花费时间与数组中当前项目的数量成比例,因此将是1 + 2 + 3 +。 .. + n与n平方成正比)
在构建数组后反转数组会快得多,因为它需要的时间与所涉及的项目数成比例。
以相反的顺序访问项目会更快,因为您可以避免反转数组。
查看“大O符号”以获取更多信息。另请注意,对于小的n值,具有O(n ^ 2)运行时的算法可以优于具有O(n)的算法。
答案 2 :(得分:1)
我的测试结果......
do {
let start = Date()
(1..<100).forEach { _ in
for var item in data {
reversedArray.insert(item, at: 0)
}
}
print("First: \(Date().timeIntervalSince1970 - start.timeIntervalSince1970)")
}
do {
let start = Date()
(1..<100).forEach { _ in
reversedArray = data.reversed()
}
print("Second: \(Date().timeIntervalSince1970 - start.timeIntervalSince1970)")
}
First: 0.0124959945678711
Second: 0.00890707969665527
有趣的是,运行它们10,000次......
First: 7.67399883270264
Second: 0.0903480052947998