什么更快:在索引 0 或 array.Reverse 处插入?
Whats faster: Insert at index 0 or array.Reverse?
我从我的数据库中获取数据的顺序与我需要的顺序相反。为了正确地排序它,我有几个选择:我可以插入在我的数组的索引 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()
以下哪个选项更快?随着项目数量的增加,两者之间会有什么显着差异吗?
通过在开头重复插入项目来创建数组最慢,因为它所花费的时间与涉及的项目数的平方成正比。
(说明:我的意思是构建整个数组的时间与 n^2 成正比,因为每次插入所花费的时间与数组中当前项目的数量成正比,因此为 1 + 2 + 3 + ... + n 与 n 的平方成正比)
构建数组后反转数组会快得多,因为它所花费的时间与所涉及的项目数成正比。
仅以相反的顺序访问项目会更快,因为您避免了颠倒数组。
查找 'big O notation' 了解更多信息。另请注意,对于较小的 n 值,具有 O(n^2) 运行时间的算法可以优于具有 O(n) 的算法。
追加新元素的平均复杂度约为 O(1)。根据文档,反转数组也有一个 constant complexity.
插入有一个 complexity O(n),其中 n 是数组的长度,您要一个一个地插入所有元素。
所以追加然后反转应该更快。但是,如果您只处理几十个元素,您将不会看到明显的差异。
我的测试结果…
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
我从我的数据库中获取数据的顺序与我需要的顺序相反。为了正确地排序它,我有几个选择:我可以插入在我的数组的索引 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()
以下哪个选项更快?随着项目数量的增加,两者之间会有什么显着差异吗?
通过在开头重复插入项目来创建数组最慢,因为它所花费的时间与涉及的项目数的平方成正比。
(说明:我的意思是构建整个数组的时间与 n^2 成正比,因为每次插入所花费的时间与数组中当前项目的数量成正比,因此为 1 + 2 + 3 + ... + n 与 n 的平方成正比)
构建数组后反转数组会快得多,因为它所花费的时间与所涉及的项目数成正比。
仅以相反的顺序访问项目会更快,因为您避免了颠倒数组。
查找 'big O notation' 了解更多信息。另请注意,对于较小的 n 值,具有 O(n^2) 运行时间的算法可以优于具有 O(n) 的算法。
追加新元素的平均复杂度约为 O(1)。根据文档,反转数组也有一个 constant complexity.
插入有一个 complexity O(n),其中 n 是数组的长度,您要一个一个地插入所有元素。
所以追加然后反转应该更快。但是,如果您只处理几十个元素,您将不会看到明显的差异。
我的测试结果…
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