芯片测试——分治法体现

前言

感觉听得有点迷糊,为什么芯片要互相测试来判断谁好谁坏呢?车间生产不是有一个统一的标准值吗,再不济找个蓝本来对照检验就好了,非要芯片两两相互测试( ̄▽ ̄)"


一次测试过程

测试方法: 将2片芯片(A和B)置于测试台上,互相进行测试,测试报告是“好”或“坏”,只取其一。
芯片测试——分治法体现_第1张图片

假设:好芯片的报告一定是正确的,坏芯片的报告是不确定的(可能会出错)

个人理解:好人一定说真话,坏人可能说真话,可能说假话。好人说你是坏人,你就一定是坏人,坏人说你是好人,你还得思考这人坏不坏。

A报告 B报告 结论
B是好的 A是好的 A,B都好或A,B都坏
B是好的 A是坏的 至少一片是坏的
B是坏的 A是好的 至少一片是坏的
B是坏的 A是坏的 至少一片是坏的

个人理解:结论相同,那么两方都说了真话或者假话;结论相悖,肯定有人撒谎了。

实际应用

输入: n片芯片,其中好芯片至少比坏芯片多1片。
问题: 设计一种测试方法,通过测试从n片芯片中挑出1片好芯片。
要求: 使用最少的测试次数

算法分析

当芯片总数为奇数时

芯片测试——分治法体现_第2张图片

当芯片总数为偶数时

芯片测试——分治法体现_第3张图片
结论: 只要n/2个芯片报好,那么该芯片就是好的,

蛮力算法

测试方法: 任取 1片测试,如果是好芯片,测试结束;如果是坏芯片,抛弃,再从剩下芯片中任取 1片测试,直到得到 1片好芯片.

时间估计:
第1片坏芯片,最多测试 n-2次,
第2片坏芯片,最多测试 n-3次,

总计 O(n^2)

分析:因为好芯片永远比坏芯片多一片,所以如果判断该芯片是坏芯片的话,只要保证测试结果里好芯片没有坏芯片多即可。
例如:
设好芯片为G(good),坏芯片为B(bad),总共有n片芯片。
当n=7时,(最多)第一次测试为坏的结果是GBGBB-(“-”为最后一次测试,无论-为G还是B,G都无法大于B,所以该此测试可以不用测),测试次数为5次。
当n=8时,(最多)第一次测试为坏的结果是GBGBBB-(“-”为最后一次测试,无论-为G还是B,G都无法大于B,所以该此测试可以不用测),测试次数为6次。
因此测试第一次为坏芯片的情况,最多需要测试n-2次。

编程实现思路:
1、输入总芯片数n,好芯片数为n/2+1,坏芯片数为n-n/2-1。
2、用随机数来表示n个芯片,奇数为好芯片,偶数为坏芯片,确保奇数要比偶数多。3、定义一个数组来存放这组随机数。
4、从n中取出一个芯片X,用剩下n-1个芯片进行加法运算。
奇数+x=为奇数——为0
奇数+x=为偶数——为1
偶数+x=为偶数——为0
偶数+x=为奇数——为1
5、用for(int 1 ; i <= n-1; i++)来实现对x的测试,输出结果为
我敲不出来,思路到这里戛然而止。

分治算法

芯片测试——分治法体现_第4张图片

芯片测试——分治法体现_第5张图片
芯片测试——分治法体现_第6张图片
芯片测试——分治法体现_第7张图片
芯片测试——分治法体现_第8张图片


头痛,不想写了,有问题直接问我吧

你可能感兴趣的:(菜鸟进阶之路,算法,java,学习,c语言)