Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
基本上我有一个非常大的对象数组,我需要删除 10% 的最不合适的对象。
每个对象都有一个与之关联的适应度变量(双精度)。我没有一个数字来确定一个对象是否合适,我只想要一堆中最不合适的。
检索(采样)最不适合的对象的最佳方法是什么?
一种方法是随机选择 20%,对数据进行排序,然后删除 10%。但我认为这不是一个非常聪明的方法。
另一种方法是始终保持数组排序,然后删除前 10%。但我认为这不是很好,因为在插入/更新时您必须始终对数组进行排序,这是一个很大的开销..
设 k 为yourCollection.length() * 0.1且n = yourCollection.length()。
yourCollection.length() * 0.1
n = yourCollection.length()
找到第 k 个最小的元素(QuickSelect 或 5 的中位数),其中关键是您的适应度。让我们称之为p。这可以在O(n).
p
O(n)
然后遍历集合,移除所有fitness小于p.fitness的item。我们有一个O(n)解决方案。
O(n)或者,您可以在其中创建一个堆key=fitness并从中删除k元素O(k * log(n))。
key=fitness
k
O(k * log(n))