什么是更快:插入索引0或array.Reverse?

时间:2017-02-22 15:22:54

标签: swift 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()

这些选项中的哪一个会更快?随着项目数量的增加,2之间是否会有任何显着差异?

3 个答案:

答案 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