选择NP-hard使用相同内容的人的子集的算法?

时间:2014-06-27 16:58:41

标签: algorithm graph approximation np bipartite

这不是家庭作业,而是我在研究过程中遇到的一个问题。我需要知道这个问题是否是NP难的。在第一种情况下,我需要一个近似算法,在后一种情况下,我需要一个有效的算法,为我提供最佳解决方案。

非正式说明:

想象一下使用某些工具的人。每个人只使用几种工具,但不是全部。有人写下谁使用了哪个工具。问题:如何找到最大的人群,每个人至少使用过其他人使用过的k工具? [先前的问题描述:与其他人相同的工具?]工具的数量仅限于t'

我对此问题进行了正式描述,这可能有所帮助:

设G =(P,T,E)为二分图,其中P代表人的集合,T代表工具集。如果人使用该工具,则在P中的节点p和T中的t之间存在边缘。目标是找到P',T'适用于以下条件:1)从任何p'在P',任何t'在T'可以通过单个边缘到达。 2)| P' |,即P'中的节点数量是最大值。

效率低下的方法是采用每个子集P'并计算每个t'的交集。与p'相关联在P'。不幸的是,这些子集的数量呈指数级增长,计算很快变得棘手。

非常感谢!

2 个答案:

答案 0 :(得分:1)

要找到最大的人群,每个人使用与其他人相同的工具,您只需要按照他们使用的工具对人员进行分组。

换句话说:

  • 创建地图:从(工具集)到(使用这套工具的人数)
  • 找到计数最多的工具集。

这绝对是多项式。

例如:

假设工具套件是 {爪锤,卷尺,多功能刀,湿度计,凿子,水平仪,螺丝刀,指甲套,滑动斜面,布局方形} source

我们将创建一个从位集(表示为字符串的整数)到整数(使用这组工具的人数)的映射。

现在,如果Dan的工具是{Claw Hammer,Utility Knife,Sliding Bevel},我们将添加以下地图:

键:1010000010,值:1。

为了添加其他人,我们将首先计算密钥。如果Dave使用与Dan相同的工具,我们将获得相同的密钥,因此我们只会增加计数:

键:1010000010,值:2。

-

  • 从一个人的工具列表构造一个位集是 O(T)
  • 搜索地图中是否已存在此类密钥 O(log(P)∙T) O(T)是比较两个字符串的最坏情况长度为T.由于密钥已经排序,因此可能要好得多。另外O(log(P)忽略了迭代结构)。
  • 增加计数是 O(1),或者 - 向地图添加新密钥是 O(log(P))(实际上它更好,因为地图迭代建造。)

总结一下 - 您可以在 O(P∙log²(P)∙T)中为所有人构建集合。同样,你可以做得更好,但这只是为了证明它是多项式的。

查找具有最高计数的键是O(P) - 在地图上行走,其中包含较少的P键。

答案 1 :(得分:1)

绝对不是NP - 硬。我会建议一种贪婪的方法。找到最大号的工具。使用它的人假设最大的这样的组使用2个工具A和B,该数字永远不会大于max(使用A或B的人数)。