描述一千万玩家在线扑克网站的共谋检测的算法复杂性的最佳方法是什么?
假设(我认为这些假设没有太大区别,所以可以随意忽略它们,但只是为了澄清):
你的工作是制作一份详尽的清单,列出每个被勾结的球员,以及他与之勾结的球员的完整名单。我最近听说这个问题被描述为NP-hard但是这个准确吗?有时候我们称之为“NP”或“NP-hard”的东西只是“硬”。
谢谢!
答案 0 :(得分:4)
我立刻看到的蛮力方法是:
Set colluders = new Set();
for(Player p1 : allPlayers)
{
for(Player p2 : allPlayers)
{
if(!p1.equals(p2) && haveColluded(p1, p2))
{
colluders.add(p1);
colluders.add(p2);
}
}
}
我没有看到调用带有大于2的参数计数的haveColluded,因为这可能会给出错误否定。我想虽然这取决于功能的成本。但是上面的结果是O(n ^ 2)调用hasColluded(n是玩家数量)。功能本身似乎是O(m),其中m是他们一起玩的游戏数量。因此,该算法在O(n ^ 3)下似乎井。为了NP难,你必须证明“问题H是NP难的,当且仅当存在NP完全问题L是多项式时间图灵可简化为H [...]换句话说,L可以通过带有oracle for Hracle的oracle机器在多项式时间内求解。“ (http://en.wikipedia.org/wiki/NP-hard)。我研究过NP完全问题(例如3-SAT,旅行商问题等),我不知道你是如何证明这一点的。但话说回来,它似乎与clique problem看起来很可疑。
答案 1 :(得分:3)
看起来像clique detection,这是NP难的。另一方面,集团的规模在这里是有限的(10),所以在最坏的情况下暴力是n ^ 10.
编辑:这里的关键问题是共谋功能的属性是什么。总是可以通过在两个较小的一组(比方说5个)玩家上调用该功能来检测10个串联在一起的玩家吗?
答案 2 :(得分:1)
在你的模型下,你所描述的应该相当容易。给你一个隐式图形(顶点是玩家,边缘对应于一起玩游戏)。你想要一张该图的子图。
如果共谋函数完全可靠,你只需在图中的每对顶点上调用它,就可以得到子图。
该子图可能相当不连贯。我希望结果图断开或连接很弱;通过做一些最小削减,很快就会出现大量连接良好的子图。
请注意,我们可以限制自己仅限于配对,因为共谋功能应服从(在置信水平方面)Collude(A,B,C)< Collude(A,B) )。
构建这种全局共谋功能似乎很难。
答案 3 :(得分:1)
我会把它分成两步:
在每手牌中迭代超过50亿手扑克牌。使用一些算法,让我们称之为算法A 。当你去的时候你会建立一个勾结图,其中顶点代表玩家,而无向加权边代表两个玩家之间勾结的信心。当算法A 因怀疑玩家X与玩家Y勾结而触发时,一些值被添加到共谋图中的加权边缘XY。当你通过已经玩过的手前进时,边缘权重会随着时间的推移而累积。当达到某个阈值时,边缘表示X和Y之间的勾结。
然后确定N个玩家顶点的列表是否具有 all 在一起的函数是验证包含N个顶点的子图是否完全连接的问题(意味着每个节点都有边缘)权重大于子图中每个其他节点的共谋阈值。 IIRC,确定这是O(n * lg(n))。