如何解决创建一个数据结构,可以有效地找到得分较高的缺失组合
我有N个实体,我想为这些实体找到大小为3的所有组合。组合的数量如此之大,以至于无法实际计算所有组合。因此,我将使用启发式方法:每个实体的得分均等于(number of times this entity was used in a combination with the combination score >= threshold) / (number of times this entity was used in a combination)
,并且我想找到一个具有combination score >= threshold
的可能性很高的组合。 (如果您能找到得分最高的组合,或者可以证明得分在某个最高百分位,则可获得加分。)
请注意,如何在不给出此问题背后大量背景的情况下很难描述如何计算组合得分,但是足以说这很难预测并且计算起来也不快。
由于这是一个持续的过程,所以我想拥有一个数据结构,可以在其中存储尝试的每个组合,以便下次可以跳过它们。这种数据结构还应该有助于找到我尚未尝试过的潜在高分组合。
一个简单的方法是:
sorted_entities = sorted(entities,key=lambda entity: entity.score,reverse=True)
for e1 in sorted_entities:
for e2 in sorted_entities:
for e3 in sorted_entities:
if not data_structure.already_have(e1,e2,e3):
data_structure.add(e1,e3)
return (e1,e3)
一些明显的问题:
- 在寻找新的组合之前,我们正在研究所有已经查看过的高分组合。
- 根据我们的评分功能,不能保证得分最高的实体将产生最高的得分组合。
我可以想到的另一种方法是概率性的:选择一个随机的实体,选择一个得分更高的实体的机会更大。然后,根据这两个实体的得分按比例选择下一个实体。然后,可以在O(N)中强制使用最佳第三选择。 (我认为这听起来很像贝叶斯优化,所以这可能是这种方法的最佳版本。)
解决方法
一种有助于检查组合是否已经存在的方法是使用bloom filter。您只需要一个带有一组实体的哈希函数:类似hash(list(sorted([e1,e2,e3])))
的东西,尽管我没有在Python中尝试过hash({e1,e3})
。
这是我目前确定的答案:
步骤1)找到使用最少组合的e1
。
步骤2)查找包含combos1
的组合e1
的列表。
步骤3)使用它在e2
中找到组合最少的combos1
。
第4步)找到包含combos2
和e1
的组合e2
的列表(注意:它将是combos1
的严格子集。)
步骤5)浏览combos2
,并创建一组使用的所有实体:existing_e3_set
步骤6)set_of_all_entities
-existing_e3_set
为您提供了所有e3
,您可以将它们与e1
和e2
组合以创建尚不存在的组合。 / p>
运行时的实体和组合数量是线性的。
我认为您可以修改第1步和第3步,以使用某种实体得分,但是我还没有考虑过如何失去对第6步中非空设置的保证。>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。