NSOrderedSet 使用啥基础数据结构来实现

Posted

技术标签:

【中文标题】NSOrderedSet 使用啥基础数据结构来实现【英文标题】:What fundamental data structure is used to implement NSOrderedSetNSOrderedSet 使用什么基础数据结构来实现 【发布时间】:2016-08-07 05:25:05 【问题描述】:

NSOrderedSet 似乎能够提供 O(1) 的哈希表查找速度和类似对象排序的数组?用于实现此目的的数据结构是什么?它是两者的组合,例如:Hashtable 和一个单独的 Array,其中索引 i 具有与其在 Hashtable 中的对象对应的键?

【问题讨论】:

我正在尝试更好地理解 Objective-C 概念以改进我的编程。问这样的问题有什么问题? 问没有错。但是,SO 不是此类问题的正确论坛。 您能否指出一条规则,即在 SO 上不允许有明确的“是/否”答案并且可以提高人们对编程语言的理解的问题?这里的问题很简单,如何实现类似于 NSOrderedSet 的东西。是否有一种基本的数据结构可以实现它,或者我们是否需要一种涉及多个数据结构的更复杂的东西。我认为它有一个是/否的答案(即不是一个主观问题)并提高了我的 CS 知识。我看不出有什么理由不允许它在 SO 上使用。 ***.com/help/dont-ask 当然这是一个有效的问题。 【参考方案1】:

我们不知道 Apple 是如何选择实现这种数据结构的。找出答案的唯一方法是对 Foundation 框架进行逆向工程。但这不是一件有用的事情,Apple 可以在每次更新时更改实现和底层数据结构。因此,依靠它来开发生产应用程序将是非常愚蠢的,因为它可能随时破坏应用程序。

如果您想自己实现这一点,您可以使用哈希表和数组的方法。最好的方法是将对象存储在数组中,并让哈希映射存储由对象作为键的数组索引。

当然,还有其他可能的方法可以通过不同的性能特征来实现。它可能只是一个数组,使得 containsObject: 测试 O(n),或者它可能只是一个哈希表(对象作为键,索引作为值),使得 objectAtIndex: 操作 O(n)。

【讨论】:

谢谢,斯文。您是否知道任何显示 Apple 提供的每个内置集合类的各种操作的运行时间的资源。即在上述情况下,明确表明 NSOrderedSet 具有 O(1) 查找包含和 objectAtX 的内容。因此,我们只需要在需要时重新发明***。 或者覆盖重复的二叉搜索树

以上是关于NSOrderedSet 使用啥基础数据结构来实现的主要内容,如果未能解决你的问题,请参考以下文章

如何向 NSOrderedSet 添加值

将新的核心数据对象插入到多个 NSOrderedSet 会忽略索引

CoreData NSOrderedSet - 修复?

iPhone的NSOrderedSet?

在CoreData的NSOrderedSet中的特定位置插入一个对象?

核心数据关系 NSOrderedSet 在每个设备上返回不同的顺序