【问题标题】:swift array 'contains' function in place optimization快速数组“包含”功能就地优化
【发布时间】: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


【解决方案1】:

每一帧都做这样的事情会非常低效。

我建议重新考虑您的设计,以避免跟踪每一帧的信息量。

如果绝对有必要,构建自己的使用Dictionary 而不是Array 的类型应该更有效。

此外,如果它适用于您的用例,使用 Set 可能是最佳选择。

【讨论】:

  • 我原以为字典会更慢,为什么你认为它会更快?
  • @brw59 因为字典和集合(实际上只是将每个键作为值映射到自身的包装字典)具有O(1) 插入、包含和删除。
  • 你有一个很好的论据@Alexander。也感谢您的“设置”见解
  • @brw59 根据键查找值比解析数组并比较它的值要快得多。由于您没有发布任何代码,我无法确定您想要做什么,但就“包含”而言,Arrays 会慢得多。
猜你喜欢
  • 1970-01-01
  • 2011-05-11
  • 2020-09-02
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多