我想知道通过NSSet迭代的大O符号是什么。 NSArray的答案显然是O(n) - 但NSSet的答案是什么? 另外 - 我假设同样的答案适用于NSDictionary?
答案 0 :(得分:9)
通过查看其桥接Core Foundation等效标题中的注释,您可以了解Apple数据结构的计算复杂性(因为它们基本上使用相同的代码)。
有趣的是,CFArray
的时间复杂度不实际上保证为O(n):
计算复杂性
数组中值的访问时间保证为 任何实施,当前和未来的最差O(lg N),但会 通常是O(1)(恒定时间)。线性搜索操作类似 O(N * lg N)的最坏情况复杂,但通常是 边界会更紧,等等。插入或删除操作 通常在数组中的值的数量是线性的,但是 在一些实现中,在最坏的情况下可以清楚地显示O(N * lg N)。 阵列中没有优势位置用于表现; 也就是说,访问低值的访问速度并不一定快 索引,或插入或删除具有高指数的值,或 不管。
这些时间复杂性表明CFArray
(因此NSArray
)实际上可能实现为树(测试表明它甚至可能在多个底层数据结构之间切换)。
同样对于CFDictionary
,给出的界限范围很广:
计算复杂性
字典中值的访问时间保证为 任何实施,当前和未来的最差O(N),但会 通常是O(1)(恒定时间)。插入或删除操作 通常也是恒定的时间,但是在O(N * N)中 在一些实现中的最坏情况。通过密钥访问值 比直接访问值更快(如果有的话) 操作)。字典将倾向于使用更多的内存 而不是具有相同数量值的数组。
我无法在CFSet
的Core Foundation标头中找到类似的评论,但检查源代码显示它基于CFBasicHash
,这是一个哈希表,所以时间复杂性对于哈希表来说是典型的 - 通常是O(1)插入,删除和测试,在最坏的情况下是O(n)。
如果你真的想知道这些数据结构是如何工作的,那么Core Foundation是开源的,所以你可以在Apple's website上阅读源代码。