【问题标题】:Fast way to check whether properties of one array of objects overlap with properties of another array of objects检查一个对象数组的属性是否与另一个对象数组的属性重叠的快速方法
【发布时间】:2016-01-06 21:30:29
【问题描述】:

我想知道是否有更好的方法来执行以下操作:

for( customObject *myObject in self.myObjects ) {
    myObjectsDictionary[myObject.objectID] = customObject;
}

基本上我有很长的自定义对象数组。这些对象中的每一个都应该有一个唯一的标识号。因此,在添加新对象之前,我创建了一个 ID 号字典,以便我可以根据这些现有 ID 号检查新提议的 ID 号并消除重复项。这似乎效率低下...是否有明显的语言功能可以更快/更好地做到这一点?

想到的是集合...我可以制作一组这些 objectID,然后将新对象的 id 与旧对象进行比较。是不是比上面的好?如果是这样,为什么?如果没有,还有其他选择吗?

【问题讨论】:

    标签: objective-c nsarray nsdictionary


    【解决方案1】:

    在大笔画级别上,您的字典解决方案相当于使用NSSet。真正提高效率的方式可能是一种不同的算法(不同于在字典和集合中隐式使用NSObjecthash)。

    例如,基于密钥 (see here) 构建的尝试将随密钥长度缩放。对于给定长度的键,它是否比散列更快是一个经验问题。

    要记住的重要原则是首先做出合理的决定(字典和集合都非常合理),除非有明显的需要,否则不要进一步优化。

    【讨论】:

      【解决方案2】:

      NSSet 将比 NSDictionary 具有(小)优势,因为前者仅存储 objectID 引用,而后者也存储 customObject 一个。

      如果您的objectID 实际上是整数类型的盒装(NSNumber)或文本(NSString)版本,那么您可以使用CFSet,它可以直接存储整数(如void *),从而节省所有的拳击。

      NS 集合将使用在 objectID 是任何类型上定义的 hash 函数,该函数可以被覆盖; CFSet 使用默认值或创建时提供的值。如果您依赖默认散列函数并且该散列对于您的特定数据集不是最优的,那么您可以考虑实现自己的散列函数 - 但只有在遇到性能问题时才去那里。

      HTH

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2022-11-21
        相关资源
        最近更新 更多