基本上,我有很多对象,需要删除10%最不适合的对象。

每个对象都有一个与之相关的适应性变量(双精度型)。我没有确定对象是否合适的数字,我只想要最小的合适对象。

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

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

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

最佳答案

令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))元素。

07-26 05:20