[转]芯片测试题型

有n个人,其中超过半数是好人,剩下的是坏人
好人只说真话,坏人可能说真话也可能说假话
这n个人互相都知道对方是好人还是坏人
现在要你从这n个人当中找出一个好人来,只能通过以下方式:
每次挑出两个人,让这两个人互相说出对方的身份,
你根具两个人的话进行判断。
问通过何种方法才能最快的找出一个好人来,
(要考虑最坏的情况)

算法分析:
(1)好人+好人---好人,好人
(2)好人+坏人---好人,坏人 或 坏人,坏人
(3)坏人+坏人---好人,好人 或 坏人,坏人 或 坏人,好人
如果两人说法相同(并且都是好人),则保留一人。如果两人说法不同或同说是坏人,则两人全部去除。这样可以保证:
(1)子问题至少减到1/2.
(2 ) 仍能保证剩余人群中好人占多数。这是因为原人群超半数是好人,将原人群分为(1)(2)(3)后,因为(2)中好人比例是1/2,且将全部被淘汰,故(1)(3)之和中好人比例不会比原人群低,即大于1/2。而对(1)(3)的处理时,好人会两中取一,坏人要么两中取一,要么全部被放弃。
因此,T(n)=T(n/2)+O(n) 线性时间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值