为什么迭代NSArray要比通过NSSet迭代更快?

时间:2015-07-02 10:11:07

标签: objective-c nsarray nsset fast-enumeration

我想知道为什么迭代NSArray比通过NSSet迭代更快?我想象它与NSArray的订购事实有关,而NSSet不是,但我是一个经过认证的答案,而不仅仅是猜测。

编辑:

我的问题是:为什么它更快,而在该主题中没有解释。而不是如果它更快。

2 个答案:

答案 0 :(得分:7)

首先:你不能说NSArrayNSSet更快。当您从评论中的链接获得时,它取决于您正在做什么。到目前为止,在NSSet的实例中搜索对象的速度更快。当你选择NSSet时,这就是你想要做的。

集和数组之间存在两个差异。

  • 数组必须保持顺序,设置不要。
  • sets必须注意唯一性,数组不需要。

所以看起来很聪明,两者都有完全不同的实现。这可能导致不同的运行时行为。所以正确的问题是:惊喜在哪里?

显然,集合的额外条件比数组的额外条件更昂贵。

BTW:NSSet的实例不可能实现它所带来的唯一性承诺。这是因为只有在将对象插入集合时才会检查唯一性。在插入对象后更改对象时,它可以变为等于集合中的另一个对象。

答案 1 :(得分:6)

@ Amin的答案在某些方面并不准确。

  1. 我们谈论的是迭代,而不是搜索。
  2. Set中搜索当然比在Array中搜索更快,因为第一次只需要 O(1)时间,而第二次需要 O(n)时间。
  3. 在我看来,NSArrayNSSet(迭代)更快,因为NSArray的访问时间是精确的O(1),尽管NSSet是O( 1)也是,但它是摊销的。
  4. 您甚至无法将对象插入NSSet
  5. 你能解释一下“显然,集合的额外条件比阵列的额外条件更贵。”