在NSMutableArray中查找不接近任何整数的整数

时间:2011-10-11 20:04:57

标签: objective-c algorithm nsmutablearray

我有一个NSMutableArray,最初将5个值设置为零。它包含屏幕上元素的x坐标,每1/60秒更新一次。每个项目的位置都在不断变化。屏幕上最多有5个项目,任何时候最少1个。

阵列中的每个项目都在0 - 480(iphone屏幕的高度)范围内。给定时间的示例数组是:

{123,450,0,0,0}

然后可能会改为:

{150,320,90,0,0}

我需要快速方法来查找不在数组中任何位置附近的位置。这可以是不在每个值周围的设定范围内的位置(例如,值不在数组中任何项目的50之内)或者在其两侧距离最远的位置。

显然,如果无法找到某个范围内的位置,则应选择最佳解决方案。

当一个新项目被添加到屏幕时需要很快,所以选择一个新位置的任何延迟都会减慢游戏动态 - 所以一个while循环是不可取的。

希望在objective-c中有一个简单的数学方法可以对此进行排序。我真的很困惑,我应该如何实现这一目标。任何帮助很多赞赏。

2 个答案:

答案 0 :(得分:1)

让我稍微改一下这个问题。你有点p1,p2,p3,p4,p5

0 <= p_i <= 480

您希望找到一个x

0 <= x <= 480

最大化功能

min_{x} ( |p1-x| + |p2-x| + |p3-x| + |p4-x| + |p5-x| )

如果这是你的目标(并且我不清楚它是或应该是),那么你可以通过检查以下哪个潜在x值最大化距离来解决这个问题:

0 , p1/2 , p1 + (p2-p1)/2 , p2 + (p3-p2)/2 , ... , p5 + (480-p5)/2

这假定为0 <= p1 <= p2 <= p3 <= p4 <= p5 <= 480。无论哪个差异条款较大,都应该选择答案。

例如,

{123,450,0,0,0}

答案是123 + (450-123)/2

对于

{150,320,90,0,0} 

答案是150 + (320-150)/2

要在Objective-C中对此进行编码,您需要有一个函数来返回数组最大条目的索引。将输入作为p1,p2,...,p5。将这些排序为递增顺序,在左侧添加0,在右侧添加480。然后制作一个长度小于1的新数组,以产生连续的差异,例如: {p1-p0, p2-p1, ..., p6-p5}其中p0 = 0p6 = 480。最后,获取此新数组的最大值索引,将其命名为i,并返回最佳位置p_i + (p(i+1)-p_i)/2

示例:

输入{150,320,90,0,0}

重新排列为{0 , 0 , 0 , 90 , 150 , 320 , 480}

差异数组{0 , 0 , 90 , 60 , 170 , 160}

索引4

的最大值

答案是150 + (320-150)/2

答案 1 :(得分:0)

我认为没有一个Objective-C对象会为你做这件事 - 你实际上将不得不做一些编程。

想到的第一个想法是某种树,但是一棵简单的B树或者你有什么不是它。也许是一棵笛卡尔树,但究竟如何应用它现在还没有找到我。

或者你可以强制它 - 按顺序放置值并扫描列表以找到最大的差距。