【问题标题】:What is the advantage of implementing NSMutableArray as a 2-3 tree?将 NSMutableArray 实现为 2-3 树有什么好处?
【发布时间】:2014-05-04 21:55:25
【问题描述】:

我在其他地方读到NSMutableArray 以几种不同的方式实现,具体取决于大小,有时以2-3 tree 的形式实现,而不仅仅是内存中的数组。这意味着像删除对象这样的操作并不像必须将数组的整个尾端复制一个那样昂贵。

我想知道是否有实现的快速摘要,这样我就不必深入研究源代码了。

  1. 数组是如何排序的?
  2. 根节点是否在数组的中间?
  3. 数组如何找到第n个元素?
  4. 还有其他优点吗 将数组实现为 2-3 树而不是快速删除 数组前面附近的对象?

搜索互联网,我找不到任何讨论将可变数组实现为树的内容。

编辑:简短回答: NSMutableArray 似乎是作为循环缓冲区实现的,所以这个问题没有任何意义。如果将数组实现为 2-3 树有优势,我仍然想知道它。

【问题讨论】:

  • 这是一篇围绕它进行讨论的文章:ridiculousfish.com/blog/posts/array.html
  • 实施细节是实施细节。如果您可以通过 Foundation 挖掘并找到将它们实现为 2-3 棵树的特定类,那么您可以将其分解并了解更多信息。但据我们所知,它已被删除或修改。
  • 要清楚,我并没有试图确定 NSMutableArray 的内部实现,我相信它可以正常工作,相反,我实际上想知道为什么将数组实现为2-3 树(在 NSMutableArray 或任何语言的任何其他数组中)。换句话说,我读到它是这样实现的,然后问自己“他们为什么要这样做?”。

标签: objective-c arrays data-structures tree nsmutablearray


【解决方案1】:

Bartosz Ciechanowski 在他的博文 "Exposing NSMutableArray" 中提供了令人难以置信的详细答案

tl;dr:这是一个“循环缓冲区:”

数据结构

您可能已经猜到了,__NSArrayM 使用了循环缓冲区。这种数据结构非常简单,但比常规数组/缓冲区要复杂一些。到达任一端时,循环缓冲区的内容可以回绕。

环形缓冲区有一些很酷的特性。值得注意的是,除非缓冲区已满,否则从任一端插入/删除都不需要移动任何内存。让我们分析一下该类如何利用循环缓冲区在其行为方面优于 C 数组。

从历史上看,__NSArrayM 是一个比 Cocoa 新的类名——在 OSX 10.0 中没有这样称呼它,但我找不到旧名称的好链接。也许它曾经是一棵树。您的第一条评论中的link 听起来就像是在 2005 年,在大尺寸下它内部不是一个循环缓冲区。

【讨论】:

  • 感谢这个优秀的资源。所以事实证明 CFArray 和 NSMutable 数组毕竟不是从树构建的,尽管它们可能是过去的。所以也许我的问题是为什么有人会为数组使用 2-3 树实现是一个毫无意义的问题。
  • 原来是covered here before——但我仍然找不到从之前的任何东西切换到__NSArrayM的更多细节。现在中间的插入总是线性的?总是这样吗?或者它是否用于实现大尺寸的树以更快地插入?
猜你喜欢
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多