根据数值

时间:2015-07-10 04:36:32

标签: json algorithm sorting nsarray

也许我认为这是错误的,但这是一个问题:

我有NSMutableArray所有JSON对象。每个对象看起来都像这样,其中有两个例如:

{
player = "Lorenz";
speed = "12.12";
},
 {
player = "Firmino";
speed = "15.35";
}

好的,这很好,这是我从webserver feed获得的动态信息。现在我想要的是假装有22个这样的条目,速度也不同。

我希望有一个计时器从1.0秒开始到60.0秒,并且每秒几次我希望它能够抓住速度刚刚过去的所有玩家。因此,例如,如果计时器在12.0时关闭,然后在12.5再次关闭,我希望它能够抓住速度在12.0到12.5之间的所有玩家名称,你知道吗?

显而易见的简单方法是每次定时器关闭时完全迭代阵列,但我希望定时器能够完成很多次,例如每秒10次或更多次,这样会相当浪费算法我想。有更好的想法吗?我可以尝试改变数据来自网络服务器的方式,但不要觉得应该是必要的。

2 个答案:

答案 0 :(得分:2)

注意:编辑以反映更正的理解,即1到60中的数字在该范围内连续递增,而不是该间隔中的随机数。

在进入定时器循环之前,您应该进行一些常见的预处理:

  1. 预先将字符串的速度转换为数值,以便快速比较,而无需每次都进行解析。这是每个项目的O(1)和O(n)来处理所有项目。

  2. 将数据放在有序容器中,例如排序列表或已排序的二叉树。这样您就可以轻松找到目标范围内的元素。这是O(n log n)对所有项目进行排序。

  3. 在第一次迭代中:

    • 使用二进制搜索查找起始索引。这是O(log n)。
    • 使用二进制搜索查找结束索引,使用起始索引绑定搜索。

    在后续迭代中:

    • 如果每次迭代增加一个可预测的数量,并且列表中元素之间的步长同样是可预测的数量,那么只需保持指针并根据Pete的注释增加。这将使每次迭代花费O(1)(仅以固定数量向前迈进)。

    • 如果迭代之间的步骤和/或列表中的条目不可预测,则按照初始情况进行二进制搜索。如果值单调递增(我现在理解要说明的问题),即使它们是不可预测的,你也可以通过维护索引将其合并到二进制搜索算法中,而不是直接从中恢复迭代。在那里,如果值是不可预测的,而是使用记住的索引来设置二进制搜索的下限,以便缩小被搜索的区域。这将使每次迭代花费O(log m),其中" m"是剩下的要考虑的因素。

    总的来说,这产生的算法不比O((N + I)log N)差,其中" I"是与前一算法相比的迭代次数O(I * N)(并将大部分计算转移到循环之外,而不是在循环内部。)

答案 1 :(得分:2)

现代计算机每秒可以进行数十亿次操作。即使您的计时器每秒关闭1000次,并且您需要处理1000个条目,您仍然可以采用天真的方法。

但是要回答这个问题,最好的方法是先根据速度对数据进行排序,然后得到速度已经过去的最后一位玩家的索引。在开始时,指针显然指向第一个玩家。然后,每当你的计时器关闭时,你将需要处理从该索引开始的一些连续的玩家。 (伪代码)中的某些东西:

global index = 0;
sort(players); // sort on speed
onTimer = function(currentSpeed) {
    while (index < players.length && players[index].speed < currentSpeed) {
        processPlayer(players[index]);
        ++ index;
    }
}