Algorithm 这个特殊的编程挑战有没有一个名字,我们能做什么比O(N^2)更好?

Algorithm 这个特殊的编程挑战有没有一个名字,我们能做什么比O(N^2)更好?,algorithm,Algorithm,问题就在这里。有N个人,其中一个是国王。每个人都认识国王,而国王却不认识任何人。关于如何最好地找出国王的号码,有没有一个名字或某种理论,在这种情况下,假设我们有一个函数,决定我是否认识j。当然,我们可以简单地为每个人先检查哪些人不认识任何人,然后检查哪些人是每个人都认识的。但这是N^2阶,我很好奇是否有更快的。提前感谢您可以在O(n)时间内完成此操作。想象一下,有一个舞厅,里面有所有的人,包括国王。我们将通过n将它们称为1。访问人员1。询问他们是否认识此人2——如果不认识,3,依此类推。他们认识

问题就在这里。有N个人,其中一个是国王。每个人都认识国王,而国王却不认识任何人。关于如何最好地找出国王的号码,有没有一个名字或某种理论,在这种情况下,假设我们有一个函数,决定我是否认识j。当然,我们可以简单地为每个人先检查哪些人不认识任何人,然后检查哪些人是每个人都认识的。但这是N^2阶,我很好奇是否有更快的。提前感谢

您可以在
O(n)
时间内完成此操作。想象一下,有一个舞厅,里面有所有的人,包括国王。我们将通过
n
将它们称为
1
。访问人员
1
。询问他们是否认识此人
2
——如果不认识,
3
,依此类推。他们认识的第一个人,person
v
,拜访并询问他们是否认识person
v+1
,如果不认识,则询问他们是否认识person
v+2
,依此类推。然后拜访他们认识的第一个人。继续这样做,直到您询问(并可能访问)
n

因为每个人都认识国王,这些人中的一个会把你介绍给不认识其他人的国王,因此国王不能把你介绍给其他人。在你开始询问最后一个人person
n
之后,你将与国王交谈

大致:

int find_king() {
    int visiting = 1;
    for (int asking_about = 2; asking_about <= n; asking_about++) {
        if (knows(visiting, asking_about)) {
            visiting = asking_about;
        }
    }
    return visiting;
}
int find_king(){
int=1;
对于(int asking_about=2;asking_about您可以在
O(n)中执行此操作
时间。想象一个有包括国王在内的所有人的舞厅。我们将通过
n
称他们为
1
。拜访person
1
。询问他们是否认识person
2
——如果不认识,
3
,等等。他们认识的第一个人person
v
,拜访并询问他们是否认识person
v+1
,如果不是
v+2
,依此类推。然后拜访他们认识的第一个人。继续这样做,直到你询问(或可能拜访)了
n

因为每个人都认识国王,这些人中的一个会把你引向不认识其他人的国王,因此国王不能把你引荐给任何人。在你问起最后一个人person
n
之后,你将与国王交谈

大致:

int find_king() {
    int visiting = 1;
    for (int asking_about = 2; asking_about <= n; asking_about++) {
        if (knows(visiting, asking_about)) {
            visiting = asking_about;
        }
    }
    return visiting;
}
int find_king(){
int=1;

for(int asking_about=2;asking_about使其成为一个图。表示国王的节点有0个传出边和N-1个传入边。@Cicada-如果您事先得到了这个图,那么这是一个很好的解决方案。如果没有,那么是O(N^2)来构造这个图。@mbeckish我只是给出了数据结构,而不是找到国王的算法:)@蝉-是的,但仅仅是构建数据结构的行为就已经让你处于O(N^2)。@mbeckish你不必构建任何东西,只要将问题视为一个图形问题。输入数据如何存储并不重要,它总是可以映射为一个图形(这个问题的答案也是如此)。制作一个图。表示国王的节点有0个传出边和N-1个传入边。@Cicada-如果你事先得到了这个图,那么这是一个很好的解决方案。如果没有,那么是O(N^2)来构造这个图。@mbeckish我只是给出了数据结构,而不是找到国王的算法:)@蝉-是的,但仅仅是构建数据结构的行为就已经让你处于O(N^2)。@mbeckish你不必构建任何东西,只要将问题视为一个图形问题。输入数据如何存储并不重要,它总是可以映射为一个图形(这个问题的答案也是如此).经过编辑,我们不会问1他们是否了解自己。经过编辑,我们不会问1他们是否了解自己。