【发布时间】:2014-01-07 22:26:35
【问题描述】:
假设我们有 N 个人,其中可能有一群名人。
每个人都认识每个名人,而每个名人都只认识其他名人。
如果给你know x y和returns true or false的功能,请识别名人组。
这个问题是识别一群名人,而不是识别人群中唯一的名人,比如http://www.geeksforgeeks.org/the-celebrity-problem/。
使用蛮力很容易。我可以构建 N 个人所有可能的子序列并使用条件过滤它们(每个人都知道每个名人,每个名人只知道其他名人)。
我也知道必须只有一个名人团体或没有。
证明:
假设我们有两个名人组,C1 和 C2。因为每个人都知道 C1 中的 ci,所以每个 C2 中的 cj 也都知道 ci;对称地,每个 ci 都知道 cj;所以 C1 和 C2 实际上属于一个组。所以我们最多只有一个名人团体或没有。
对可能的线性算法有什么想法吗?
编辑
可能有一群名人,也可能没有。
【问题讨论】:
-
一个名人认识其他名人?比如,任何一个名人都认识其他所有名人?
-
一个非名人是否也能认识任何数量的其他非名人?
-
每个人都只认识名人还是两个非名人可以互相认识?
-
最具挑战性的情况是如果每个人都认识每个人,因为这需要 N*(N-1) 次调用
know来验证每个人都是名人。 -
答案难道不是每个人认识的人的交集吗?
标签: algorithm