什么更快:在索引 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