基本上,我有很多对象,需要删除10%最不适合的对象。
每个对象都有一个与之相关的适应性变量(双精度型)。我没有确定对象是否合适的数字,我只想要最小的合适对象。
检索(采样)最不适合的对象的最佳方法是什么?
一种方法是随机选择让路20%,对数据进行排序,然后删除10%。但是我认为这不是一个非常明智的方法。
另一种方法是使数组始终保持排序,然后删除前10%。但是我认为这不是很好,因为在插入/更新时您必须始终对数组进行排序,这是一个很大的开销。
最佳答案
令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))
元素。