【发布时间】:2017-06-29 01:25:56
【问题描述】:
我想知道contains 函数的内置数组结构是否有任何优化。如果它每次运行它都对contains 进行线性搜索,那么它充其量是 O(n),它变成 O(n^2),因为我将循环通过另一组点来检查,但是如果它以某种方式在第一次运行“包含”时在幕后对数组进行排序,然后每个后续的“包含”将是 O(log(n))。
我有一个数组随着用户进入应用程序的深度而逐渐变大,而且我经常使用“包含”,所以我希望它会减慢应用程序的速度,用户使用的时间越长应用。
如果数组没有任何幕后优化,那么我应该自己构建吗? (例如快速排序,每次添加到数组时都执行insert(newElement:, at:)?)
具体来说,我正在使用
[CGPoint],
CGPointArrayVariable.contains(newCGPoint) // run 100s - 10000s of times ideally every frame, (but realistically probably every second)
当我添加新的CGPoints 时,我正在使用
CGPointArrayVariable += newCGPointSet.
所以,问题是:我可以继续使用内置的.contains 函数(它是否足够快?)或者我应该构建自己的结构优化contains,并保持数组排序? (如果这是推荐的方向,也许插入排序比快速排序更适合使用)
【问题讨论】:
-
如果您对快速的
contains检查感兴趣,您应该使用Set。 -
CGPointArrayVariable你绝对不应该这样命名一个变量。 1) Swift 约定是使用 lowerCamelCase 作为变量名。 2) 我们知道它是一个变量,因为它是小写的驼峰式。 3) 我们知道它是一个数组,因为我们可以通过选项单击它来查看它的类型。 4) 同样,我们知道它是CGPoints 的数组。给它起一个实际上告诉我们一些我们还不知道的东西的名字。例如,如果它是一个生成点数组,则将其命名为spawnPoints。使它非常适合迭代:for spawnPoint in spawnPoints ... -
我的变量实际上并不是这样命名的,这是为了让你们@Alexander 看得清楚
-
你用它做什么?
-
@PEEJWEEJ,我在一堆 x-y-z 对象位置的 x-z 平面中创建了一个凸包,我正在使用许多可能单独移动的对象的当前位置来生成其余对象在不断增长的凸包一定距离内的无限地图的
标签: swift optimization swift3 mathematical-optimization