这实际上是一个由三部分组成的问题,但我自己回答了第一个问题:
我正在使用iPhone,屏幕上有许多物体(最多200个)。每个对象都需要查看它是否与其他对象重叠,并采取相应的行动。我最初的天真实现是每个对象运行通过每个其他对象的列表来检查它们的边界框(使用CGRectInsersectsRect
)。
所以我的问题(和答案)是什么更好的方法?我的新实现是使用插入排序每个帧对数组进行排序(因为数据将大部分已经排序)在每个对象的y位置上,然后仅检查一次搜索的两侧最近的对象,以查看是否它在垂直范围内,然后水平检查。
第一个问题:插入排序是我想要用于一个对象数组的方法,这些对象往往随机移动但只是在很小的范围内,所以它们大部分都是基于最后一帧保持顺序?另外:当我调用
时,NSArray使用什么排序算法- sortedArrayUsingSelector:
我会假设它使用快速排序,因为它在一般情况下最有用。有人知道我错了吗?有人知道我是否可以改变排序方法,或者我是否必须编写自己的排序函数?
第二个问题:是否存在使用二分搜索从排序数组中检索项目的函数,而不是我假设使用的天真方法
- indexOfObject:
还是我必须自己写?
答案 0 :(得分:4)
NSArray在内部使用许多不同的数据结构,具体取决于数组中的对象数量。有关详细信息,请参阅Peter Ammon blog entry。但基本上这意味着你不能指望某种类型的发生。有时使用C数组编写自己的数组实现是值得的,这样你就可以自己控制排序。
实施碰撞检测肯定有更快的方法。查看边界体积层次结构,如KD树或类似物。
据我所知indexOfObject:是唯一的方法,但它可能不像你想象的那么愚蠢。 NSDictionary的所有内容都可以使用,因此他们可以在NSArray中使用其中的一些智能。