algorithm - 在线性时间内解决相识任务

标签 algorithm complexity-theory time-complexity

给定一组 n 个人,A 可能认识也可能不认识 B(同样,A 认识 B 并不意味着 B 认识 A)。由 nxn bool 矩阵定义的所有熟人关系。
让我们将名人定义为人人皆知,但无人知晓的人。

任务是提出一个算法,该算法需要 O(n) 时间和 O(1) 额外空间来查找集合中的名人或声明该集合不包含任何名人。

首先,我的印象是,写这篇文章的人有意扰乱那些将要解决这个问题的人的头脑。

我认为,这里的线性时间意味着我们可以将时间与输入大小(实际上是 n*n)进行线性比较。
然后提出二次时间算法似乎是微不足道的任务。另一方面,如果我们假设我之前的陈述有误,我不相信在时间为 O(k) 的边为 k 的未排序矩阵中可以找到很多...

我将在这里留下二次时间算法的草稿:

for x in range(0,side-1):
    knowingAmount = sumAlongColumn(x)
    if knowingAmount == side:
        celebritySuspectKnows = sumAlongRow(x)
        if celebritySuspectKnows == 1:
            return x
return -1

所以,如果你们在这里帮助我,我将不胜感激。我是否正确地解释了这个具有时间复杂度要求的警告,或者这里存在更有效的算法?

最佳答案

对于每个人:

  • 如果我们没有潜在的名人,就让这个人成为潜在的名人。

  • 如果潜在名人和此人都不认识,或者他们都认识,请重置潜在名人。

  • 如果潜在名人认识此人,但相反,则让此人成为新的潜在名人。


或者,简化:

让第一个人成为潜在的名人。

对于每个人:(从第二个开始)

  • 如果潜在名人认识此人,则让此人成为新的潜在名人。

完成后,如果我们有潜在的名人,请再次检查此人是否不认识其他人以及是否每个人都认识他们,以确保他们确实是名人。

复杂度: O(n) 时间,O(1) 空间。

证明正确性的关键是:

  • 如果那个人是名人,我们就不能继续前进,因为继续前进的唯一标准是了解其他人,这对名人来说是不可能的。

  • 如果有名人,我们总是会切换到名人,因为我们会遍历所有人,如果一个人认识这个人,我们总是会切换,这对于所有其他人来说都是如此。

但是,如果没有名人,我们最后仍然会有一个(非名人)候选人(假设我们很容易提名某人为潜在名人),所以我们需要确保候选人是名人。

关于algorithm - 在线性时间内解决相识任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23649675/

相关文章:

algorithm - 上界、下界

algorithm - 以下程序的运行时间是多少?

algorithm - 排列列表的后缀

c++ - C++98 中获取并继续调用当前类不知道的类方法的最简单方法是什么?

for-loop - 计算嵌套for循环的复杂度

algorithm - 渐进复杂性、算法

python - 缺少不应该缺少的参数(Python)?

c++ - 像钻石一样的信号量

c++ - Big Oh 是唯一用于衡量 STL 复杂性的符号吗

java - 简单 while 循环的时间复杂度