如何解决什么软件算法会从大集合中选择不同的项目子集
设置
假设我有非常多的项目。每个项目都有一个形状、大小和颜色。他们可能是
- 三角形、圆形或正方形
- 红色、绿色或蓝色
- 小或大
我无法对这些属性在项目之间的分布做出任何假设。我有理由确定这不是一百万个大红色三角形,但这总是有可能的。
问题
我想选择 36 个形状,并在所有属性类中尽可能“多样化”地表示。澄清一下,从非常大的集合中抽取 36 个项目,我理想情况下喜欢 12 个红色、12 个绿色、12 个蓝色、12 个三角形、18 个小等。
现在有 18 种可能的不同项目类型(3 种颜色 * 3 种形状 * 2 种尺寸),因此一种方法是包含每种不同类型中的两种(假设我有它们)。
如果我没有有足够的每种不同类型,另一种(不切实际的蛮力)方法是迭代 36 个项目的每个可能子集并保留最佳子集。 >
我确信这是可以通过众所周知的算法解决的更广泛问题的一个特定实例,但我无法确定 Google 的魔法词。我标记为 knapsack-problem
是因为感觉可能就是这样,但我想知道是否有更好的方法来解决这个问题?
您能否提供解决方案或至少适当的搜索词方面的帮助?
解决方法
看看reservoir sampling。为每种形状/颜色/尺寸组合制作一个储液器(即 36 个储液器),每个储液器的容量为 36。对所有元素进行一次遍历,并为每个元素选择合适的储液器并执行储液器采样步骤。
这将您的问题减少到最多 36*36 = 1296 个元素,从所有元素中公平采样,甚至涵盖只有一个组合的最坏情况。
然后你可以简单地洗牌水库,从每个(跳过空的水库)中随机挑选一个元素,从水库中删除它们。如果您拥有每种形状/颜色/尺寸中的一种,您将立即完成。如果没有,您再次洗牌水库并进行另一次传递,并继续这样做直到您选择了 36 个元素。这为您提供了数据集上的统一样本,并通过形状/颜色/大小偏差进行了标准化。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。