在人群中寻找“星”的算法的时间复杂度

时间:2019-11-04 14:40:03

标签: algorithm time-complexity

我遇到了一个问题,要求在一系列正常人中寻找一颗星星。恒星的定义是“一个不认识的人,但每个人都知道的人”。输入是n人的数组,您可以做的基本测试是询问人i“您认识人j”,如果他们认识他,则回答“ true”,否则回答“ false”。问最少的问题。

我为此算法发现的最坏情况的最佳解决方案是O(nlog)(您问一个人是否认识他们i + 1之后的那个人,如果他们知道,则将他们从潜在的恒星中移除,如果不是,您将i + 1从潜在的恒星中删除,每次运行都经过阵列,我可以将潜在恒星的数量减半),但是摘录说:“证明在最坏的情况下,可以在O(n)中完成< / p>

1 个答案:

答案 0 :(得分:3)

  

恒星的定义是“一个不认识但每个人都知道的人

根据这个定义,一群人中最多只能有一个“星星”。如果有一个以上的恒星,那么他们俩都必须知道另一颗,否则另一个就不是恒星,但是它们本身就不是恒星。

因此,有两个子问题。

  1. 找到潜在的星星。

如果这样的人不止一个,那么就没有星号;如果只有这样一个人:

  1. 检查其他人是否认识那个人。

第一部分可以用您提出的算法完成。无论您问A是否认识B,C是否知道D等,还是问A或B的“获胜者”是否了解C等,由于您每次询问都删除一个“候选人”,您最多需要O(n)个步骤,而不是O(nlogn)。之后,只剩下一个潜在恒星,可以执行第二步,这是对组中所有其他人的简单循环。

两个步骤的时间复杂度均为O(n),总共(仍然)为O(n)。