搜索前3个数字的最快捷,最有效的方法?

时间:2010-05-25 09:28:09

标签: java android arrays list collections

我目前有一个大约8-10个数字的数组,会定期更改。

所以大约每隔5到10秒就会更新数字。

我需要每10秒钟在阵列中获得前3个数字。

这一切都是在移动设备上完成的。

阵列是当前扫描的接入点的RSSI,因此在我的办公室通常大约10个,但在现场测试中它可能会增加到大约50个。

当我迭代数组3次时,每次取出三个最高数字并将它们放在三个先前声明的变量中。

我的问题是在这种情况下我应该怎么做才能提高速度和效率?

5 个答案:

答案 0 :(得分:7)

数字只有10 - 什么都不做。它已经足够有效了。

如果尺寸增加,您可以使用max-heap存储您的号码。

答案 1 :(得分:6)

为什么不使用Arrays.sort方法,据我所知quick sort引用它。

编辑:已验证它使用了tuned quick sort

答案 2 :(得分:2)

您的算法已经是O(n),快速排序是> O(n log n)因此肯定不是这样做的。如果使用树结构,例如AVL树,则可以将速度提高到O(log n)。 至于数组,你当前的数据是最快的方法。

答案 3 :(得分:2)

您当前的算法需要3 * n比较。您可以执行插入排序的变体来改进:

  1. 将输入数组的前3项放在输出数组中,对它们进行排序
  2. 遍历输入数组的其余项目,
    1. 将每个项目放入正确位置的输出数组
    2. 将输出数组修剪为3个项目
  3. 这需要2 * n次比较。 (不过我不确定这是否值得额外的复杂性。)

答案 4 :(得分:1)

我认为在一般情况下你应该使用基于QuickSort的QuickSelect算法,并且及时O(n)修改你的数组内联和'准排序'它。

假设您的数组是A [1..10]并且没有排序,通过调用QuickSelect(A,7)您要问'在排序数组中哪个数字应该在第七个位置?',以及这与说'在这个特定阵列中哪个数字是第三个更大?'相同。现在最棒的是,QuickSelect确保在此调用A [i]< = A [7]之后全部为0<我<对于所有7< 7,A [7]< = A [j]。学家更多信息在维基百科Quick Selection Algorithm

无论如何大小只有10,你可以使用insert-sort(最坏情况为O(n ^ 2),但对小数组有效)然后得到三个第一个/最后一个元素

编辑: - 树结构对于十个元素来说是一种过度杀伤,通常涉及时间/空间权衡(你需要很多指针) - QuickSelect有一个O(n ^ 2)最坏的情况,但'中位数中位数'在最坏的情况下得到相同的结果O(n)

相关问题