查找名人组而不是单个名人的线性算法

杰克逊故事

假设我们有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实际上属于一个组。因此,我们最多只有一个名人团体或一个。

关于可能的线性算法有什么想法吗?

编辑

可能有一群名人,可能没有。

马特

是的,这可以在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. 名人的定义是每个人都知道他们,而名人只认识其他名人。

上面的算法解决了案例#1。只要我们可以假设至少存在一位名人,这种情况也适用于情况2 否则,我们将不得不最后验证潜在名人列表是否彼此了解,这需要O(N*M)时间,其中M是潜在名人的数量。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

“名人”算法的最佳解决方案

来自分类Dev

Ubuntu的名人堂页面发生了什么?

来自分类Dev

从维基百科 API 中获取名人

来自分类Dev

查找兼容元素的最佳组的算法

来自分类Dev

CoSign API:如何在签名中显示签名人的标题

来自分类Dev

为什么我的返回值中出现逗号?JavaScript名人名称显示工具

来自分类Dev

DocuSign是否需要签名人名称和电子邮件才能生成签名URL?

来自分类Dev

如何获得由DocuSign中的代理商/中介指定的签名人的嵌入式签名URL?

来自分类Dev

查找一组git项目何时被破坏的算法?

来自分类Dev

查找一组数组的最大子集(内核)的算法

来自分类Dev

查找两组数字是否同构(在排列下)的算法

来自分类Dev

查找一组用户之间的相互关系的算法

来自分类Dev

MST的线性时间算法

来自分类Dev

线性时间图算法

来自分类Dev

线性筛分算法

来自分类Dev

为什么下面的查询不是“单个组”功能?

来自分类Dev

ORA-00937:不是单个组函数(XMLAGG)

来自分类Dev

线性时间恒定空间算法,用于查找列表中出现1次的元素

来自分类Dev

当签名人对文档进行签名时,RightSignature API将发送到我的回调URL的什么内容

来自分类Dev

Docusign | 嵌入式签名| 发件人如何与收件人/签名人共享“收件人签名URL”?

来自分类Dev

用MuPAD查找非线性方程组的所有解

来自分类Dev

查找信号的相角-求解非线性(三角)方程组

来自分类Dev

线性渐变 divs 组

来自分类Dev

对角非线性梯度算法

来自分类Dev

对角非线性梯度算法

来自分类Dev

在固定域中查找单个变量函数的最小值/最大值的算法

来自分类Dev

SQL:从单个表中查找所有记录,而不是从2列中查找

来自分类Dev

SQL:从单个表中查找所有记录,而不是从2列中查找

来自分类Dev

在列表中查找等于目标的一组数字的算法

Related 相关文章

  1. 1

    “名人”算法的最佳解决方案

  2. 2

    Ubuntu的名人堂页面发生了什么?

  3. 3

    从维基百科 API 中获取名人

  4. 4

    查找兼容元素的最佳组的算法

  5. 5

    CoSign API:如何在签名中显示签名人的标题

  6. 6

    为什么我的返回值中出现逗号?JavaScript名人名称显示工具

  7. 7

    DocuSign是否需要签名人名称和电子邮件才能生成签名URL?

  8. 8

    如何获得由DocuSign中的代理商/中介指定的签名人的嵌入式签名URL?

  9. 9

    查找一组git项目何时被破坏的算法?

  10. 10

    查找一组数组的最大子集(内核)的算法

  11. 11

    查找两组数字是否同构(在排列下)的算法

  12. 12

    查找一组用户之间的相互关系的算法

  13. 13

    MST的线性时间算法

  14. 14

    线性时间图算法

  15. 15

    线性筛分算法

  16. 16

    为什么下面的查询不是“单个组”功能?

  17. 17

    ORA-00937:不是单个组函数(XMLAGG)

  18. 18

    线性时间恒定空间算法,用于查找列表中出现1次的元素

  19. 19

    当签名人对文档进行签名时,RightSignature API将发送到我的回调URL的什么内容

  20. 20

    Docusign | 嵌入式签名| 发件人如何与收件人/签名人共享“收件人签名URL”?

  21. 21

    用MuPAD查找非线性方程组的所有解

  22. 22

    查找信号的相角-求解非线性(三角)方程组

  23. 23

    线性渐变 divs 组

  24. 24

    对角非线性梯度算法

  25. 25

    对角非线性梯度算法

  26. 26

    在固定域中查找单个变量函数的最小值/最大值的算法

  27. 27

    SQL:从单个表中查找所有记录,而不是从2列中查找

  28. 28

    SQL:从单个表中查找所有记录,而不是从2列中查找

  29. 29

    在列表中查找等于目标的一组数字的算法

热门标签

归档