从大型数组中采样数据

时间:2013-11-13 13:46:36

标签: java arrays sampling

基本上我有一个非常大的对象数组,我需要删除10%最不适合的对象。

每个对象都有一个与之相关的适应度变量(双精度)。我没有一个数字来决定一个物体是否合适,我只想要最不合适的一堆。

检索(采样)最不适合的对象的最佳方法是什么?

一种方法可以随机选择让20%的方式,对数据进行排序,然后删除10%。但我认为这不是一种非常聪明的做法。

另一种方法是保持数组始终排序,然后删除前10%。但我不认为这是非常好的,因为你必须始终在插入/更新时对数组进行排序,这是一个很大的开销。

1 个答案:

答案 0 :(得分:2)

设k为yourCollection.length() * 0.1n = yourCollection.length()

找到第k个最小元素(QuickSelect或5的中位数),其中关键是你的健康。我们称之为p。这可以在O(n)

中完成

然后遍历整个集合并移除所有健康度低于p.fitness的项目。我们有一个O(n)解决方案。

或者,您可以使用O(n)key=fitness中创建一个堆,并在k中删除O(k * log(n))中的{{1}}个元素。