通过NSSet和NSDictionary迭代的大O符号是什么

时间:2014-10-04 15:09:42

标签: ios data-structures nsarray nsdictionary nsset

我想知道通过NSSet迭代的大O符号是什么。 NSArray的答案显然是O(n) - 但NSSet的答案是什么? 另外 - 我假设同样的答案适用于NSDictionary?

1 个答案:

答案 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上阅读源代码。