【问题标题】:Approximate runtime comparison for Objective-C data structuresObjective-C 数据结构的近似运行时比较
【发布时间】:2012-10-21 17:29:53
【问题描述】:

假设你有一堆 NSArray。这些数组都包含包裹在 NSValues 中的 CGPoints。所有元素都不是唯一的。所以某些元素可以出现在多个数组中。 将这些数组组合成一个数组以使生成的数组只包含唯一元素的最快方法是什么?

目前我正在这样做:

  1. 使用setByAddingObjectsFromArray将每个数组插入到NSSet中
  2. 用集合的内容填充结果数组

另一个选项是这样的:

  1. 遍历每个数组一次并将每个值插入到 NSDictionary 中(如果它还没有的话)
  2. 遍历字典的键一次并将每个键插入结果数组中

传统的运行时分析认为第一个选项应该与O(n log n) 一起扩展,其中 n 是所有初始数组中的元素数(遍历所有元素并将每个元素插入到二叉搜索树或类似的日志时间)。对于第二种方法,运行时间是O(n),因为查找和插入哈希表是在摊销的常数时间内运行的。 然而,在阅读了一些有关 Apple 数据结构的信息后,假设它们的行为类似于传统数据结构似乎是愚蠢的。

【问题讨论】:

    标签: objective-c algorithm data-structures runtime big-o


    【解决方案1】:

    由于这两种方法都介于 O(n)O(n log n) 之间,并且您的 n 可能足够小,以至于 log n 是有限且小的,因此常数因素可能会决定其中哪一个是最快的。

    此时,最好使用看起来像您的用例的数据进行基准测试。

    我相信,但不确定,NSSet 也是用哈希实现的。

    【讨论】:

    • NSSet肯定是用hash实现的,在使用isEqual上就有冲突
    【解决方案2】:

    实际上...我认为时间几乎相同,但是,在使用 NSDictionary 的情况下,您将获得一点内存开销,因为在这种情况下,您需要将键复制到该 NSDictionary。 NSDictionaryNSSet 的工作方式相同:

    1. hash 检查唯一性
    2. 如果两个项目有相同的缓存,isEqual 会被调用

    您提到的方法没有太大区别。

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-15
      • 2011-10-07
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多