【问题标题】:Why is iterating through NSArray is faster than iterating through NSSet?为什么迭代 NSArray 比迭代 NSSet 快?
【发布时间】:2015-07-02 10:11:07
【问题描述】:

我想知道为什么迭代 NSArray 比迭代 NSSet 更快?我认为这与 NSArray 是有序的,而 NSSet 不是这样的事实有关,但我认为这是一个经过验证的答案,而不是只是猜测。

编辑:

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

【问题讨论】:

标签: objective-c nsarray nsset fast-enumeration


【解决方案1】:

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

  1. 我们谈论的是迭代,而不是搜索。
  2. Set 中搜索当然比在Array 中搜索要快,因为第一个只需要 O(1) 时间,而第二个需要 O(n) 时间。
  3. 在我看来,NSArrayNSSet(迭代)更快,因为NSArray 的访问时间是精确的 O(1),虽然 NSSet 也是 O(1),但它是摊销的。
  4. 您甚至不能将对象插入NSSet

您能否详细解释一下“显然,集合的额外条件比数组的额外条件更昂贵。”

【讨论】:

    【解决方案2】:

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

    集合和数组之间有两个的区别。

    • 数组必须保持顺序,集合不需要。
    • 集合必须注意唯一性,而数组则不需要。

    因此,对两者都有完全不同的实现似乎很聪明。这可能导致不同的运行时行为。所以正确的问题应该是:惊喜在哪里?

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

    顺便说一句:NSSet 的实例不可能实现它所做出的关于唯一性的承诺。这是因为只有在将对象插入集合时才检查唯一性。插入后更改对象时,它可以与集合中的另一个对象相等。

    【讨论】:

    • 你的最后一段很有趣。你有什么文件可以支持我可以阅读吗?
    • 不,这没有记录。只需在数组中使用两个可变字符串进行尝试。 stackoverflow.com/questions/30535292/…
    • 问题谈论迭代而不是搜索。所以斯科特是对的
    猜你喜欢
    • 1970-01-01
    • 2012-01-31
    • 2018-11-17
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2013-12-19
    • 2014-02-22
    • 2019-07-30
    相关资源
    最近更新 更多