algorithm - 如何有效地计算小尺寸的条件产品?

标签 algorithm language-agnostic set

这可能更像是一个数学问题而不是编程问题,但我已经考虑了一段时间并且很难弄清楚这是否是一个可解决的问题。

我有以下内容:

  • 集合 AB 来自一些符号集
  • bool 函数 F : A × B → {0,1}

我想构造集合 C = {(x,y) : x ∈ A, y ∈ B, 其中 F(x,y) = 1}。

(对于任何一对,F 都可以在 O(1) 中计算)

到目前为止,如果 F 是常数时间,则此计算基本上只包含通过函数 F 在 A × B 上的过滤器,运行时间为 O(|A| × |B|)。

但是,我知道 C 的一个属性,我觉得它可以帮助我......

我知道|C| << |一个| |B|,事实上我很确定|C|关于|A|。我觉得有一些方法可以利用它(我最近被介绍了概率算法,我觉得它可以提供帮助,但我绝对不确定)。

我认为需要一些形式的辅助结构来解决这个问题,这本身应该不会有太大问题,只要结构只是 A 大小的多项式(计算幂集可能有点多,A 可能有点大)。

这也感觉像是已被证明具有某种下限复杂性的东西,但我真的没有学术知识来证明它。

任何关于我应该查看哪些域的指导和提示都将不胜感激。

到目前为止我想到了什么:

  • 这看起来很像 SAT issue但我对那些事情几乎一无所知

  • 这个问题与集合判别问题(至少……计算两个集合之间的差异)有点同构。但是,我无法以这种形式找到关于该主题的任何研究(只得到很多“迭代 A,迭代 B”类型的答案)。

最佳答案

在您提出问题的措辞中,唯一正确的解决方案是按照您的建议对 A 和 B 以及过滤器进行双重迭代。那是因为你已经陈述了关于“构造集合 C”的问题,它缺少其他信息,通常意味着枚举集合 C。唯一的方法就是做到这一点并获得 C 的精确枚举,至少根据所提供的信息,是在 A × B 中的每个元素上计算 F。

以另一种方式解释这个问题,如果你有一个特征函数,你可以说你有一个 C 的定义,但那只是 F。所以我假设这不是你的意思。

关键似乎是您需要阐明 F 的相关属性,因为这是 C 枚举的算法 Hook 。我的意思是您应该提出一个关于 F 的公理,让您可以通过一些捷径直接过滤。这可能意味着,例如,存在一些允许更短算法的辅助函数 G。假设有这样一个 G,枚举算法将评估 F 和 G,而不是单独评估 F。

关于algorithm - 如何有效地计算小尺寸的条件产品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232580/

相关文章:

language-agnostic - 以编程方式操作多轨 ogg 文件

c - "backspace"转义字符 '\b' : unexpected behavior?

language-agnostic - 抽象基类何时可以拥有(非静态)数据成员?

c++ - 如何比较两个 Compare of two std::set

c++ - 指针是否存储在 std::set const 中?

c# - 如何检查字节数组是否包含另一个数组

java - 如何随机排列没有两个重复项的字符数组?

python - 确定给定数组的任何排列是否使长度为 K 的所有子数组的总和相等

performance - 现实生活中的人队列数据结构

c++ - 为什么这行得通? std::set 使用搜索键和自定义比较器查找