我目前有一个大约8-10个数字的数组,会定期更改。
所以大约每隔5到10秒就会更新数字。
我需要每10秒钟在阵列中获得前3个数字。
这一切都是在移动设备上完成的。
阵列是当前扫描的接入点的RSSI,因此在我的办公室通常大约10个,但在现场测试中它可能会增加到大约50个。
当我迭代数组3次时,每次取出三个最高数字并将它们放在三个先前声明的变量中。
我的问题是在这种情况下我应该怎么做才能提高速度和效率?
答案 0 :(得分:7)
数字只有10 - 什么都不做。它已经足够有效了。
如果尺寸增加,您可以使用max-heap存储您的号码。
答案 1 :(得分:6)
答案 2 :(得分:2)
您的算法已经是O(n),快速排序是> O(n log n)因此肯定不是这样做的。如果使用树结构,例如AVL树,则可以将速度提高到O(log n)。 至于数组,你当前的数据是最快的方法。
答案 3 :(得分:2)
您当前的算法需要3 * n比较。您可以执行插入排序的变体来改进:
这需要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)