【问题标题】:Array vs Dictionary search performance in SwiftSwift 中的数组与字典搜索性能
【发布时间】:2018-04-14 00:08:22
【问题描述】:

我认为这可能是一个简单的答案,但我想我会尽快检查...

假设我在代码中的不同点将Ints 添加到数组中,然后我想查找将来数组是否包含某个Int..

var array = [Int]()

array.append(2)
array.append(4)
array.append(5)
array.append(7)

if array.contains(7) { print("There's a 7 alright") } 

这是否比我创建字典更明智?

var dictionary = [Int:Int]()

dictionary[7] = 7

if dictionary[7] != nil { print("There's a value for key 7")}

显然有一些原因,例如,您可能希望消除具有相同编号的重复条目的可能性...但我也可以使用 Set 来做到这一点。我主要只是想知道 @ 的性能987654326@ 与 array.contains(value)

感谢您的宝贵时间

【问题讨论】:

  • 您是否真的看到了性能问题,或者这只是一个普遍的好奇问题?不要浪费时间担心性能,直到你有事情要担心。首先编写可读、可维护的代码。
  • 试一试并测量......
  • 这取决于许多因素:值的顺序是否重要、值的数量、插入的频率……

标签: arrays swift performance dictionary


【解决方案1】:

一般来说,Dictionaries 提供常量,即 O(1) 访问,这意味着 searching 如果值存在并且更新它比使用 Array 更快,这取决于实现可以是 O( n)。如果这些是您需要优化的东西,那么Dictionary 是一个不错的选择。但是,由于字典强制键的唯一性,您不能在同一个键下插入多个值。

基于这个问题,我建议您阅读Ray Wenderlich's Collection Data Structures,以比我在此处提供的更全面地了解数据结构。

【讨论】:

  • 很好的答案和很好的链接 ;) 为了完整起见,我只会补充说 searching 无序的Array 是 O(n) 操作。
  • @PauloMattos 谢谢,用更多关于数组搜索性能的细节编辑了我的答案
【解决方案2】:

我做了一些采样!

我编辑了您的代码,使打印语句为空。

我运行代码 1.000.000 次。每次我测量分别访问字典和数组需要多长时间。然后我减去 arrTime (arrTime - dictTime) 的 dictTime 并每次保存这个数字。

完成后,我对结果取平均值。

结果是:23150。这意味着超过 1.000.000 次尝试访问阵列的速度快了 23150 纳秒。 最大差异为 2426737,最小差异为 -5711121。

以下是图表上的结果:

【讨论】:

  • 如果您运行整个代码,而不是两个 if 语句 100 万次,您不仅可以捕捉到 contains(7)[7] 的性能,还可以捕捉到分配和插入也是。这也很有趣,但可能不是 OP 打算衡量的内容
猜你喜欢
  • 2015-03-28
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-02
  • 2022-11-20
  • 2018-07-06
相关资源
最近更新 更多