这不是家庭作业,而是我在研究过程中遇到的一个问题。我需要知道这个问题是否是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'。不幸的是,这些子集的数量呈指数级增长,计算很快变得棘手。
非常感谢!
答案 0 :(得分:1)
要找到最大的人群,每个人使用与其他人相同的工具,您只需要按照他们使用的工具对人员进行分组。
换句话说:
这绝对是多项式。
例如:
假设工具套件是 {爪锤,卷尺,多功能刀,湿度计,凿子,水平仪,螺丝刀,指甲套,滑动斜面,布局方形} (source)
我们将创建一个从位集(表示为字符串的整数)到整数(使用这组工具的人数)的映射。
现在,如果Dan的工具是{Claw Hammer,Utility Knife,Sliding Bevel},我们将添加以下地图:
键:1010000010,值:1。
为了添加其他人,我们将首先计算密钥。如果Dave使用与Dan相同的工具,我们将获得相同的密钥,因此我们只会增加计数:
键:1010000010,值:2。
-
总结一下 - 您可以在 O(P∙log²(P)∙T)中为所有人构建集合。同样,你可以做得更好,但这只是为了证明它是多项式的。
查找具有最高计数的键是O(P) - 在地图上行走,其中包含较少的P键。
答案 1 :(得分:1)
绝对不是NP - 硬。我会建议一种贪婪的方法。找到最大号的工具。使用它的人假设最大的这样的组使用2个工具A和B,该数字永远不会大于max(使用A或B的人数)。