芯片测试:分治思想

文章介绍了如何在n个芯片中通过分治法判断A芯片是否为好芯片,以及如何在保证好芯片数量多于坏芯片的情况下找到一个好芯片。讨论了两种方法的时间复杂度,蛮力算法为O(n^2),而分治算法在偶数和奇数情况下都能达到线性时间复杂度O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题引入

  • 一次测试过程
    在这里插入图片描述
    假设:
  • 好芯片的报告一定是正确的
  • 坏芯片的报告是不确定的
    测试结果分析
    在这里插入图片描述
  • 每一种报道都可能A,B都是坏芯片
  • 而只有第一种情况才有可能A,B都是好的

2. 如何在n个芯片里面判断A芯片是不是好芯片?

输入:
n片芯片,其中好芯片至少比坏芯片多一片
问题
设计一种测试方法,找出一片好芯片

2.1 例:假设 n = 7,好芯片数 >= 4.

那么除去A,还有 6 个芯片,我们要拿其余 6 个芯片分别与A芯片进行测试
注意:

  • 是看其余 6 个芯片对A的测试结果,不是A对其余 6 个芯片的测试结果

结果:

  • 6个报告中至少 3 个报A是好的,则A好
  • 6个报告中至少 4 个报A是坏的,则A坏

结论:

  • 当n为奇数,且好芯片数>=(n+1)/2.
  1. A好,至少有(n-1)/2个报告为好
  2. A坏,至少有(n+1)/2个报告为坏

2.2 例:假设 n = 8:好芯片数 >= 5.

同理得到结论:

  • 当n为偶数:好芯片数 >= n/2 + 1.
  1. A好,至少有n/2个报告为好
  2. A坏,至少有n/(2+1)个报告为坏

3. 如何在n个芯片里面找到一个好芯片?

3.1 蛮力算法

在这里插入图片描述
测试一个芯片是不是好芯片参考目录2的方法

  • 时间估计最长:
  1. 第一片坏芯片,最多测试n-2次(当测试结果为 坏 好 坏 好…
  2. 第二片坏芯片,同上测试n-3

  3. 共:n-2 + n-3 + n-4 + … +2
  • 总计Θ(n2)

3.2 分治算法

3.2.1 n为偶数时分治过程

在这里插入图片描述
n 个芯片两两分为一组,那么一共可以分 n/2 个组
对于其中一组来说(参考目录1问题引入)

  1. 若结果都报好,则要么这 2 片芯片都好,要么都坏,所以只挑其中一个芯片进行下一轮测试
  2. 若是其他情况,则至少有一个芯片是坏的,就把两片芯片都丢掉
  3. 那么经过一次分组测试下来,问题规模变为原来的一半
  • 那么执行一次上述操作,芯片规模至少会减少一半
3.2.1.1 递归截止条件: n <= 3
  • 3片芯片,1次测试可以得到好芯片
  • 1或2片芯片,不需要再测试
    原因: 原问题描述为好芯片个数比坏芯片个数大,要用分治思想,那么分治之后子问题性质不变(下面证明)
3.2.1.2 分治算法正确性

证明:n为偶数时,经过一轮淘汰,剩下的好芯片比坏芯片至少多一片
设:A,B都好的芯片有 i 组,A与B一好一坏的芯片有j组,A与B都坏的有k

  • 初始: 总数为 n = 2i +2j +2k
  • 且 2i + j > 2k +j (好芯片比坏芯片至少多一片)
    得到 i > k
    而经过一轮递归后
  1. i组:保留i好芯片
  2. j组:全部淘汰
  3. k组:最多保留k坏芯片 (k组全报告正确的时候)
  4. 此时下一轮中,保留了n = i好芯片 + 最多 k坏芯片
  • 我们要证明:剩下的芯片中,好芯片个数比坏芯片个数大,即 i>k,得证

此时,n为偶数时已经证明完全正确,下面处理n为奇数的情况

3.2.2 n为奇数时处理

在这里插入图片描述

  • 这里不符合好的芯片比坏的多
    所以
    在这里插入图片描述
    单独测试:目录2 如何在n个芯片里面判断A芯片是不是好芯片 一样
  • 最多需要测试 O(n)次
    因此,整个过程为
    T(n) = T(n/2) + O(n)
    T(3) = 1
    T(2) = T(1) = 0
    得到T(n) = O(n)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值