芯片测试算法及时间复杂度分析
一.蛮力算法与分治算法
#include <stdio.h>
#include <math.h>
#define OVERFLOW -2
#define OK 1
#define ERROR 0
typedef int Status;
//芯片测试蛮力算法
void ChipTest_1()
{printf("请输入芯片个数\n");int amount;scanf("%d", &amount);getchar();//一片一片测试,好芯片需要测试芯片中至少一半证明它是好芯片,坏芯片需要测试芯片中多于一半证明//它是坏芯片//前提是好芯片至少比坏芯片多一片int count, test_ceil_amount;for (int i = 1; i <= (int)ceil((double)amount / 2); i++){count = 0;for (int j = i + 1; j <= amount; j++){printf("请输入第%d块芯片测试第%d块芯片的结果,用“T”与“F”表示\n",j,i);char c = getchar();getchar();if (c == 'T')count++;}test_ceil_amount = amount - i;if (count >= (int)ceil((double)test_ceil_amount / 2)){printf("第%d片是好芯片\n", i);break;}elseprintf("第%d片是坏芯片\n", i);}
}
//芯片测试分治算法
Status ChipTest_2(int amount)
{if (amount == 1){printf("剩余芯片一定为好芯片\n");return OK;}//如果芯片总数为奇数则会有轮空芯片产生,其余芯片测试这个轮空芯片,如果为好芯片,测试成功,坏//芯片则淘汰if (amount % 2 == 1){int count = 0;for (int i = 1; i <= amount - 1; i++){printf("请输入第%d块芯片测试第%d块芯片的结果,用“T”与“F”表示\n", i, amount);char c = getchar();getchar();if (c == 'T')count++;}if (count >= (int)ceil(((double)amount - 1) / 2)){printf("第%d片是好芯片\n", amount);return OK;}else{printf("第%d片是坏芯片\n", amount);amount--;}}//芯片总数一定为偶数,可以取两片芯片相互测试,如果都报好,取一片留一片,一好一坏或者测试结果//都为坏都扔掉//这样留下的每个组的情况只可能是都好或者都坏,其他两种情况都扔掉是因为这样一组至少可以排除一//个坏芯片,仍然保持好芯片数量比坏芯片多int chipcount = amount;for (int i = 1; i <= amount / 2; i++){printf("请输入第%d块芯片测试第%d块芯片的结果,用“T”与“F”表示\n", 2 * i - 1, 2 * i);char c1 = getchar();getchar();printf("请输入第%d块芯片测试第%d块芯片的结果,用“T”与“F”表示\n", 2 * i, 2 * i - 1);char c2 = getchar();getchar();if (c1 == 'T' && c2 == 'T'){printf("取一片扔一片\n");chipcount--;}else{printf("都扔\n");chipcount -= 2;}}ChipTest_2(chipcount);
}
int main()
{int amount = 5;ChipTest_2(amount);
}
二.时间复杂度分析
1.分治算法
W(n)=W(n/2)+O(n),W(1)=0
等式右边第一项至多n/2规模,因为可能芯片会全扔,O(n)为轮空处理,n为奇数时候进行处理,偶数时候不需要,经过迭代得出W(n)=O(n),为线性时间复杂度。
2.蛮力算法
W(n)=W(n-1)+n-1,W(n/2)=0
好芯片比坏芯片多一片,测试剩余n/2还没找到好芯片说明剩余芯片都为好芯片,经过迭代可知W(n)=O(n^2),所以分治算法比蛮力算法好。
芯片测试算法及时间复杂度分析相关推荐
- 算法的时间复杂度分析
算法的时间复杂度是一个函数,它定性描述该算法的运行时间.这是一个代表算法输入值的字符串的长度的函数.时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数.使用这种方式时,时间复杂度可被称为是渐 ...
- 【基础】算法的时间复杂度分析
1.什么是时间复杂度? 首先,解决一个问题肯定有许多种方式可以实现,那么如何评价一个算法的好坏?处理相同的数据量,用时更少,用的空间更少. 那么如何估算一个程序的运行时间与数据量的关系,这个函数就是算 ...
- 字符串匹配KMP算法及其时间复杂度分析
字符串匹配算法是非常常见的算法.考虑长度为nnn的文本(text)字符串A[1,2,⋯,n]A[1,2,\cdots,n]A[1,2,⋯,n],长度为mmm的匹配(pattern)字符串B[1, ...
- 算法的时间复杂度分析之O(logn)、O(nlogn)
复杂度分析之O(logn).O(nlogn) 对数阶时间复杂度非常常见,同时也是最难分析的一种时间复杂度.我通过一个例子来说明一下. int i = 1;while (i <= n) {i = ...
- DQN算法的时间复杂度分析
DQN算法的算法流程如下: 时间复杂度: 设: Initialize replay memory D \mathcal{D} D to capacity N N N (运行消耗 t 0 t_0 t0 ...
- 算法学习——时间复杂度分析与渐进符号
时间复杂度 时间复杂度:算法执行运算的操作数丢掉低阶数,再去掉所有系数. 例如 a = 1#操作数1 b = 2#操作数1 c = 3#操作数1 for i in n:#操作数nprint(a,b,c ...
- java快速排序的时间复杂度_程序猿必备排序算法及其时间复杂度分析
常用的时间复杂度 常数阶\(O(1)\) 说明: 只要代码中没有复杂的循环条件,无论代码的函数是多少,一律为常数阶\(O(1)\) int i=1; int j=3; int m=0; m=i+j; ...
- 1.1. 分治法实例—芯片测试
1. 问题描述 输入:n片芯片,其中好芯片至少比坏芯片多1片 问题:设计一种测试方法,通过测试从n片芯片中挑出1片好芯片 要求:使用最少的测试次数 2. 解题思路 1. 判定芯片A的好坏 问题:给定芯 ...
- 递归算法中的时间复杂度分析
对于一种算法的时间复杂度分析还是特别重要的,在一些非递归算法中,我们仅仅看运算次数最多的那一行代码可能执行多少次就可以,实际就是看在循环中变量的变化,但是对于递归算法中该怎么分析呢?下面介绍几种递归函 ...
最新文章
- 控制Open With菜单项的注册表键值
- BZOJ-1192-鬼谷子的钱袋
- lucky前面加a还是an_“不可数”名词前何时加a/an,何时不加?来自本站教师群的两道典型题问答,揭示了规律 白话英语201931...
- 2014\Province_C_C++_B\1 啤酒和饮料
- Python10/22--面向对象编程/类与对象/init函数
- 计算机专业中最受热议的4个专业,2018考研后身价倍增的4个专业盘点
- nginx 如何处理请求系列3-server_name指令
- 钱少事多,开源项目维护人员几乎集体出走
- 为什么我偏爱用 GitHub 来写书?
- 如何使用SpingMvc实现省市县三级级联?
- 2019美赛参赛获奖经验
- 毕向东java视频js_js foteach 传智播客毕向东老师 新版JAVASE基础学习视频教程 ...(8)...
- 浅谈Clean Code
- linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明
- 爬虫练习--豆瓣英美剧爬虫
- SSM+老年人社区服务平台 毕业设计-附源码211711
- 抖音天花板,电商冲不破
- 变步长龙格库塔法matlab代码,matlab龙格库塔法变步长龙格库塔法.doc
- HttpClient 模拟登录手机版新浪微博
- WideDeep论文翻译
热门文章
- OSI的7层模型和TCP/IP四层模型
- vuecli 实现导航切换
- linux高性能服务器编程书本总结
- Security安全登录
- ffmpeg运行在服务器上,如何在脱离流媒体服务器的时候使用ffmpeg 监测.m3u8直播视频流的状态?...
- c++17文件系统<filesystem>
- 基于Gromacs的蛋白分子动力学模拟(RMSD、RMSF及蛋白的回旋半径)
- C语言中alarm的应用
- Springboot 删除指定文件夹或文件(Java删除指定文件夹或文件)
- torch.repeat()与numpy.repeat()和 numpy.tile()比较