Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 什么更快:在索引0或数组处插入。是否反转?_Swift_Reverse - Fatal编程技术网

Swift 什么更快:在索引0或数组处插入。是否反转?

Swift 什么更快:在索引0或数组处插入。是否反转?,swift,reverse,Swift,Reverse,我从数据库中获取数据的顺序与我需要的相反。为了正确排序,我有两个选择:我可以插入在数组索引0处获得的每一条新数据,或者只是附加它,然后在最后反转数组。大概是这样的: let data = ["data1", "data2", "data3", "data4", "data5", "data6"] var reversedArray = [String]() for var item in data { reversedArray.insert(item, 0) } // OR rev

我从数据库中获取数据的顺序与我需要的相反。为了正确排序,我有两个选择:我可以插入在数组索引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之间是否会有显著差异?

通过在开始时重复插入项目来创建数组的速度最慢,因为它需要与所涉及项目数量的平方成比例的时间

(澄清:我的意思是构建整个数组需要的时间与n^2成比例,因为每个插入所需的时间与数组中当前项目的数量成比例,因此将是1+2+3+…+n,与n的平方成比例)

在构建阵列后反转阵列会快得多,因为它需要与所涉及的项目数量成比例的时间

只按相反的顺序访问项目会更快,因为您可以避免反转数组


有关更多信息,请查阅“大O符号”。还请注意,对于较小的n值,运行时为O(n^2)的算法可能优于运行时为O(n)的算法。

附加新元素的摊销复杂度约为O(1)。根据文档,反转阵列也有一个问题

插入有a,其中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

试试看!你的意思是
reversedArray.insert(项,位于:0)
reversedArray=data.reversed()
,对吗?您是否对其进行了基准测试?如果是的话,你发现了什么?没有使用swift的经验,所以我只是猜测。反向应该更有效。IMO,你也应该考虑RealSerdOnAccess集合,我想我也可以以相反的顺序访问我的数组元素,这可能是最快的:<代码>数组[ARAY.COUNTION,1 -I]代码/>代码,所以在最后反转数组大约需要插入0的70%。当时大多数人的假设都是正确的。很有趣,谢谢你的测试。这不是你能做的吗?抱歉批评你,但如果“大多数人的假设都是真的”,你为什么要发这个问题呢?你可以测试一下!我在这里问是因为我认为有人已经有了答案,而这种测试可以分析一个特定的案例,它告诉你的关于总体性能的信息相对较少。通过以小容量增量扩展阵列,您将触发一些WOR情况,以实现指数级容量扩展()。使用预分配容量可能会显著改变结果。是的,但我看到的所有常用阵列实现都没有设置为允许在不移动现有对象的情况下在开始时插入,因此每次插入可能需要与元素数量成比例的时间,以及1+2+3+…+n与n的平方成正比。每个插入是的,但他通过一次插入一个元素来构建一个包含n个元素的列表,使用所有插入构建整个列表是O(n^2),因为插入成本是1+2+3+…+对不起,我把我的答案编辑得更清楚了。然而,我认为你对日志的看法是错误的。考虑两个序列的1 + 2 + 3 + +…然后按相反的顺序对它们进行配对,得到:(n+1)+(n-1+2)+…+(1+n)。这等于原始总和的2x,显然等于n*(n+1)。因此,原始和等于n^2+n的一半,即O(n^2)。获得反向视图具有恒定的复杂性。反转数组(使用
array.reverse()
newArray=array.reversed()
)的复杂性为O(n)。@MartinR array.reversed()不就是这么做的吗?从文档中可以看到:“reversed():返回一个以相反顺序显示集合元素的视图。[…]复杂性:O(1)”有多个“reversed”方法。在
array=array.reversed()中调用SequenceType的此方法。
First: 7.67399883270264
Second: 0.0903480052947998