基本上我有一个非常大的对象数组,我需要删除10%最不适合的对象。
每个对象都有一个与之相关的适应度变量(双精度)。我没有一个数字来决定一个物体是否合适,我只想要最不合适的一堆。
检索(采样)最不适合的对象的最佳方法是什么?
一种方法可以随机选择让20%的方式,对数据进行排序,然后删除10%。但我认为这不是一种非常聪明的做法。
另一种方法是保持数组始终排序,然后删除前10%。但我不认为这是非常好的,因为你必须始终在插入/更新时对数组进行排序,这是一个很大的开销。
答案 0 :(得分:2)
设k为yourCollection.length() * 0.1
和n = yourCollection.length()
。
找到第k个最小元素(QuickSelect或5的中位数),其中关键是你的健康。我们称之为p
。这可以在O(n)
。
然后遍历整个集合并移除所有健康度低于p.fitness的项目。我们有一个O(n)
解决方案。
或者,您可以使用O(n)
在key=fitness
中创建一个堆,并在k
中删除O(k * log(n))
中的{{1}}个元素。