社会名流问题算法详细复杂度分析

该博客探讨了一个寻找社会名流(被所有人认识但不识所有人)的问题,提出了询问算法,确保提问次数为O(n)。通过分析,算法在最坏情况下需要询问3(n - 1)次,确保找到名人或确认其不存在。伪代码展示了算法流程,并讨论了可能的反例。
摘要由CSDN通过智能技术生成

题目

在n个人中,被所有人认识却不认识所有人的人,被称作社会名流(或称名人)。若存在社会名流,则找出他。可以使用的唯一方法是询问:“请问你知道那个人吗?”

请给出提问次数为O(n)的算法,写出伪代码,分析算法的正确性,并给出算法运行时间的精确分析(O(n)中隐藏的系数)。

思路

用A指向B表示A认识B,那么社会名流如下图中的5号。
在这里插入图片描述
当问A是否认识B时, 若A认识B则A不是社会名流,若A不认识B则B不是社会名流。每次询问都能排除一个人,所以按顺序询问n-1次即可只剩一个候选人。

但要注意,仅剩的人并不一定就是社会名流!题目中没明确社会名流一定存在,所以最后需要加上确认环节:

  1. 他是否被所有人认识
  2. 他是否不认识所有人

两种反例如下:
在这里插入图片描述
在这里插入图片描述
伪代码如下:

k←1  //记录社会名流候选人编
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值