- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我们有 N 个人,里面可能一群名人。
每个人都认识每个名人,每个名人只认识其他每个名人。
如果给你know x y
函数,返回 true 或 false
,请识别名人组。
本题是识别出一群名人,而不是识别出人群中唯一的名人,比如http://www.geeksforgeeks.org/the-celebrity-problem/ .
使用蛮力很容易。我可以构建 N 个人所有可能的子序列,并用条件过滤它们(每个人都认识每个名人,每个名人只认识其他名人)。
我也知道一定只有一个名人团体,或者没有。
证明:
假设我们有两个名人群体,C1 和 C2。因为每个人都知道 C1 中的 ci,所以 C2 中的每个 cj 也都知道 ci;对称地,每个 ci 都知道 cj;所以C1和C2其实属于一个组。所以我们最多有一个名人团体,或者没有。
对可能的线性算法有什么想法吗?
编辑
可能有一群名人,也可能没有。
最佳答案
是的,这在 O(N) 中是可能的(但请参阅下面的第二次编辑)。这是一种算法。
从0到N-1枚举所有N个人。
int find_a_celebrity()
{
int C = 0; // C is a potential celebrity
for( int i=0 ; i<N ; ++i )
if( !know(i,C) ) // C is not a celebrity nor are all j<i, but i might be.
C = i;
for( int i=0 ; i<N ; ++i ) // Loop a second time to check everyone knows C.
if( !know(i,C) ) return -1;
return C;
}
int C = find_a_celebrity();
如果 C==-1
则没有名人。否则设置 { y | know(C,y) }
是所有名人的集合。总之,这对所有 N 个人最多进行了 3 次迭代,因此及时发现了 O(N)
。
编辑:
// Output the set of celebrities
if( C == -1 ) std::cout << "There are no celebrities.";
else for( int i=0 ; i<N ; ++i ) if( know(C,i) ) std::cout << i << ' ';
std::cout << std::endl;
编辑 2:
这个问题有两种解释:
上述算法针对案例 #1 解决了这个问题。这也适用于案例 #2,只要我们可以假设至少存在一位名人。否则,我们将不得不在最后验证潜在名人列表中是否只相互认识,这需要 O(N*M)
时间,其中 M 是潜在名人的数量。
关于algorithm - 寻找名人群体的线性算法,而不是单个名人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20983260/
我试图找出理论上能够相处的尽可能多的 friend 群体,即群体中的每个人都应该至少认识群体中其他人的 50%。 我正在尝试为此提出一种算法,该算法不会花费太长的时间; Facebook 的 API/
我正在开发一个应用程序,用户可以在其中将图片上传到服务器,然后向他们选择的人员发送带有显示这些图片的链接的电子邮件。 我的问题是关于在数据库中组织人员(我正在使用 MySQL)。 我希望每个用户都有这
我有一个评级数据框,其中包含 userId、movieId、rating 行。我想找到评分最高的用户。 这是我写的代码: import pandas as pd ratings = pd.read_c
我有一个脚本,单击时会显示更多信息,再次单击时会隐藏信息。问题是,当单击时,它会显示和隐藏具有相同类名的所有 div 的信息,而不仅仅是被单击的 div。我环顾四周,我认为我需要在其中的某处添加“th
我是一名优秀的程序员,十分优秀!