Java 搜索前三名数字的最快、最有效的方法?
我现在有一个大约8-10个数字的数组,它们会定期变化 因此,大约每5-10秒更新一次数据 我需要每10秒获取阵列中的前3个数字 这一切都是在移动设备上完成的 该阵列是当前扫描的接入点的RSSI,因此在我的办公室,它通常在10个左右,但在现场测试中,它可能会增加到50个左右 在这一分钟,我在数组中迭代了3次,每次我取出三个最高的数字,并将它们放在三个先前声明的变量中Java 搜索前三名数字的最快、最有效的方法?,java,android,arrays,list,collections,Java,Android,Arrays,List,Collections,我现在有一个大约8-10个数字的数组,它们会定期变化 因此,大约每5-10秒更新一次数据 我需要每10秒获取阵列中的前3个数字 这一切都是在移动设备上完成的 该阵列是当前扫描的接入点的RSSI,因此在我的办公室,它通常在10个左右,但在现场测试中,它可能会增加到50个左右 在这一分钟,我在数组中迭代了3次,每次我取出三个最高的数字,并将它们放在三个先前声明的变量中 我的问题是,在这种情况下,我应该采取什么措施来提高速度和效率?数字只有10-什么都不做。它已经足够有效了 如果大小增加,您可以使用存
我的问题是,在这种情况下,我应该采取什么措施来提高速度和效率?数字只有10-什么都不做。它已经足够有效了
如果大小增加,您可以使用存储号码。为什么不使用Array.sort方法呢?据我所知,该方法在引擎盖下使用 保罗
编辑:验证它使用了一个您的算法已经是O(n),快速排序是>O(n log n),所以这肯定不是实现的方法。如果使用树结构,例如AVL tree,则可以将速度提高到O(对数n)。
仅对于阵列,您当前的算法是最快的方法。您当前的算法需要3*n比较。您可以执行插入排序的一种变体来改进:
这需要2*n的比较。(不过,我不确定这是否值得付出额外的复杂性。)我认为在一般情况下,您应该使用基于快速排序的QuickSelect算法,并在时间上O(n)内联修改数组并对其进行“准排序”
如果您的数组是[1..10]且未排序,则通过调用QuickSelect(A,7)可以询问“排序数组中应位于第七位的数字是哪一个?”,这与说“此特定数组中第三个较大的数字是哪一个”相同。现在最棒的是QuickSelect确保了在这次通话后,我的问题是——你的解决方案是慢下来还是更学术化?我们说的是每10秒约30次迭代……不,不是太慢,更学术。请在此背景下定义“高效”的含义。任何比当前实现更快的方法我建议用谷歌搜索“过早优化是万恶之源”谢谢,这更像是一个学术问题,我还应该声明数组可能会增加,现在编辑这个问题。但是更新AVL树不会比O(n)更昂贵吗?