题目
在n个人中,被所有人认识却不认识所有人的人,被称作社会名流(或称名人)。若存在社会名流,则找出他。可以使用的唯一方法是询问:“请问你知道那个人吗?”
请给出提问次数为O(n)的算法,写出伪代码,分析算法的正确性,并给出算法运行时间的精确分析(O(n)中隐藏的系数)。
思路
用A指向B表示A认识B,那么社会名流如下图中的5号。
当问A是否认识B时, 若A认识B则A不是社会名流,若A不认识B则B不是社会名流。每次询问都能排除一个人,所以按顺序询问n-1次即可只剩一个候选人。
但要注意,仅剩的人并不一定就是社会名流!题目中没明确社会名流一定存在,所以最后需要加上确认环节:
- 他是否被所有人认识
- 他是否不认识所有人
两种反例如下:
伪代码如下:
k←1 //记录社会名流候选人编