algorithm - 这个特定的编程挑战是否有名称,我们可以做些什么比 O(N^2) 更好?

标签 algorithm

问题来了。有N个人,其中一个是king。每个人都认识国王,而国王却不认识任何人。鉴于我们有一个函数可以确定人 i 是否认识人 j,是否有关于如何最好地找出国王号码的名称或理论?当然,我们可以简单地为每个人先检查哪些人不认识任何人,然后再检查其中哪些人每个人都知道。但这是 N^2 的顺序,我很好奇是否有更快的东西。提前致谢

最佳答案

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

因为每个人都认识国王,其中一个人会把你介绍给不认识其他人的国王,因此国王不能把你介绍给任何其他人。在您开始询问最后一个人 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;
}

关于algorithm - 这个特定的编程挑战是否有名称,我们可以做些什么比 O(N^2) 更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26597830/

相关文章:

c++ - 超出内存或无效内存引用 - C++ 错误

java - Java 中的基本递归算法

获取半径覆盖区域内每个点的中心点列表的算法

database - 执行 : a string-to-string database

c++ - 标准算法的并行实现和副作用

algorithm - 使用 perl 哈希从所有者列表中选择单个所有者时如何处理这种情况?

python - 如何优化 python 列表中的比较组合

java - 每次迭代保存模拟数据的最佳策略是什么?

arrays - 在 NASM Assembly 中递归添加数组中的所有元素

algorithm - 当我们有两个输出时的反向传播算法