【问题标题】:Create a data structure that can efficiently find missing combinations with a high score创建一个可以有效找到高分缺失组合的数据结构
【发布时间】:2020-12-09 03:27:41
【问题描述】:

我有 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, e2, e3)
        return (e1, e2, e3)

几个明显的问题:

  • 在寻找新的组合之前,我们正在查看我们已经查看过的所有高分组合。
  • 根据我们的评分函数,不能保证得分最高的实体会产生最高得分的组合。

我能想到的另一种方法是概率法:选择一个随机实体,有更多机会选择得分更高的实体。然后根据这两个实体的得分比例选择下一个实体。然后可以在 O(N) 中强制执行最优的第三选择。 (我认为这听起来很像贝叶斯优化,所以这可能是这种方法的最佳版本。)

【问题讨论】:

  • 什么是“组合分数”,它是如何计算的?
  • @btilly 这就是这部分要解决的问题:“如果不给出这个问题背后的大量背景,就很难描述评分函数,但可以说它很难预测,而且计算速度也不快。”我将对其进行编辑,以使其更清楚地表明它是在谈论计算组合得分。
  • 正确的算法将完全取决于评分函数。我个人会根据元素似乎有助于得分超过一系列阈值来建议某种“评级功能”。然后运行一堆实验,找出什么效果好。

标签: algorithm data-structures


【解决方案1】:

帮助检查组合是否已存在的一种方法是使用bloom filter。您只需要一个包含一组实体的哈希函数:类似于hash(list(sorted([e1, e2, e3]))),尽管我没有在 Python 中尝试过hash({e1, e2, e3})。

【讨论】:

    【解决方案2】:

    这是我目前确定的答案:

    第 1 步)找到使用它的组合最少的e1。
    步骤 2) 查找包含e1 的组合列表combos1。
    步骤 3) 使用它找到e2 在combos1 中组合最少的e2。
    第 4 步)查找包含e1 和e2 的组合列表combos2(注意:它将是combos1 的严格子集。)
    步骤 5) 遍历 combos2 并创建一组所有使用的实体:existing_e3_set
    第 6 步)set_of_all_entities - existing_e3_set 为您提供所有 e3s,您可以将其与 e1 和 e2 组合以创建尚不存在的组合。

    运行时与实体和组合的数量成线性关系。
    我认为您可以修改第 1 步和第 3 步以使用某种实体分数,但我没有考虑过这会如何失去您最终将在第 6 步中获得非空集的保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 2022-01-18
      相关资源
      最近更新 更多