当前位置:   article > 正文

分治法(二)—— 芯片测试(c++)_算法设计芯片测试c语言代码

算法设计芯片测试c语言代码

芯片测试

测试方法:将两片芯片(a,b)置于测试台上,互相进行测试,测试报告为“好”或“坏”,只取其一。

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

测试结果分析:

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

输入:n片芯片,其中好芯片至少比坏芯片多一片

问题:设计一种测试方法,通过测试从n片芯片中挑出一片好芯片。

要求:使用最少的测试次数

结论:至少一半的芯片报“好”,则该芯片为好芯片。

          超过一半芯片报“坏”,则该芯片是坏芯片。

分治法设计思想:

假设n为偶数,将n片芯片凉凉一组做测试淘汰,剩下芯片作为子问题,进入下一轮分组淘汰。

淘汰规则:“好”,“好”  -> 任意留一片,进入下一轮(因为前提是好芯片比坏芯片至少多一片,如果一共有奇数个,根据单个的轮空,其中一定会有两个好的在一组或者轮空的是一个好的,所以这样的规则可以留下一个好的)

                  其他情况-> 全部抛弃(一好一坏或者两个坏的一定会有一个坏的,这样可以淘汰两个坏的或者一好一坏,不会影响剩余留下来的同样是好的比坏的至少多一)

上面说了 当数量为奇数时需要对单个芯片进行轮空操作:处理办法时对该单个轮空芯片进行单独测试,用其余所有芯片对其进行测试,如果至少一般芯片报好,则该芯片为好芯片,直接返回该芯片即可;如果该芯片是坏芯片,则舍弃该芯片,这样对单独的芯片进行处理了以后,就可以进行两两测试了。

为了方便,我使用了结构体存芯片,包括芯片编号和芯片的好坏。(下面代码在我自己的测试中没有出错,但是知道是不是有没有考虑到的地方,如果大家发现有错误,欢迎给我指出错误)

  1. //芯片测试
  2. struct Chip{
  3. int num; //芯片编号
  4. int state; //好坏
  5. };
  6. //两个芯片进行测试,2全好,0全坏,1一好一坏
  7. int judge(Chip *a,Chip *b){
  8. int count = 0;
  9. if(a->state==1){
  10. count=+b->state; //如果a是好的,判断b的结果与b一致
  11. }else if(a->state==0){
  12. count +=(rand()%2); //如果a是坏的,判断b可能好可能坏,随机产生
  13. }
  14. if(b->state==1){
  15. count += a->state;
  16. }else if(b->state==0){
  17. count +=(rand()%2);
  18. }
  19. return count;
  20. }
  21. //如果为奇数个
  22. vector<Chip*> oddTest(vector<Chip*> a){
  23. int size = a.size();
  24. vector<Chip*> result;
  25. int count = 0; //轮空操作
  26. for(int i=1;i<size;i++){
  27. if(a[i]->state ==1){
  28. count = count + a[0]->state;
  29. }else{
  30. count = count + (rand()%2);
  31. }
  32. }
  33. if(count >= size/2){ //如果轮空的是好的
  34. result.push_back(a[0]); //只返回这个 否则舍弃
  35. }else{
  36. for(int i =1;i<size;i+=2){
  37. int r = judge(a[i],a[i+1]);
  38. if(r == 2){
  39. result.push_back(a[i]); //判断后面的
  40. }
  41. }
  42. }
  43. return result;
  44. }
  45. //需测芯片个数为偶数
  46. vector<Chip*> evenTest(vector<Chip*> a){
  47. int size = a.size();
  48. vector<Chip*> result;
  49. for(int i =0;i<size;i+=2){
  50. int r = judge(a[i],a[i+1]);
  51. if(r == 2){
  52. result.push_back(a[i]);
  53. }
  54. }
  55. return result;
  56. }
  57. int test(vector<Chip*> a){
  58. int n = a.size();//有几个芯片
  59. if(n==3){
  60. int r = judge(a[0],a[1]); //选前两个进行测试
  61. if(r==1){ //如果一好一坏 取第三个
  62. return a[2]->num;
  63. }else{ //其他 任取一片
  64. return a[0]->num;
  65. }
  66. }
  67. else if(n==2||n==1){
  68. return a[0]->num; //任取一片 取第一片
  69. }
  70. vector<Chip*> next;
  71. while(n>3){
  72. if(n%2==0){
  73. next = evenTest(a);
  74. }else{
  75. next = oddTest(a);
  76. }
  77. return test(next);
  78. }
  79. }

测试时直接输入芯片的好坏

  1. int main(){
  2. //芯片测试
  3. vector<Chip*> chip ;
  4. for(int i=0;i<10;i++){
  5. Chip* a = new Chip();
  6. a->num = i;
  7. cin>>a->state;
  8. chip.push_back(a);
  9. }
  10. int t = test(chip);
  11. cout<<"芯片为:"<<t;
  12. return 0;
  13. }

时间复杂度分析:

\left\{\begin{matrix} W(n) = W(n/2) + O(n)\\ W(1) = W(2) = 0\\\ W(3) = 1 \end{matrix}\right.\Rightarrow W(n) = O(n)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/860104
推荐阅读
相关标签
  

闽ICP备14008679号