1、1算法分析与设计实验报告实验 1 算法效率与时空复杂度检验姓名 XXX 学号 XXX 班级 XXXXXX时间:XXXX-XX-XX 地点:XXX同 组 人:无指导教师:XXX实验目的 1、掌握一门程序设计语言2、掌握算法及程序设计的一般策略与方法3、掌握算法实验的一般步骤4、掌握算法分析与设计、算法比较的一般方法5、掌握算法实验中的时空复杂度的分析方法6、掌握算法实验方案的设计方法实验内容 a) 选择一个合适的程序设计语言(如 C、C+、PASCAL 等)b) 根据问题设计算法。问题如下(百钱买百鸡问题)假设公鸡 5 元钱一只,母鸡 3 元钱一只,小鸡一元钱 3只。要用 100 块钱刚好买 1
2、00 只鸡,问有多少种买法,每种买法中公鸡、母鸡、小鸡的数量各为多少?设计一个实验方案,验证求解此问题的算法的正确性,比较并分析各算法的优劣。c) 设计实验方案。方案中应包括i.多种问题求解算法ii.算法执行时间获取方法iii.抗时间“噪声”方法iv.时间结果分析对比方法d) 根据算法和实验方案设计实验程序e) 设计求解此问题的多种算法,并将它们转换成相应程序。f) 分析各算法(程序)的特点,比较它们的优劣。g) 安装程序设计语言系统。h) 输入各个程序,验证它们的正确性。i) 设计并运行能统计各程序执行时间并能抗“噪声”的程序,统计各算法的时间开销,并与之前所做的理论分析比较,看是否一致。实
3、验环境 硬件: Intel(R) Pentium(R) CPU RAM:4G软件:Myeclipse2013实验前准备21、 算法设计:见实验步骤 22、 程序设计:见实验步骤 3实验步骤1、利用 spark 语言写出初步的算法,再用 java 作为程序实现语言,实验利用的 IDE 为myelcipse2013,若直接在机器上编译运行需要安装 JDK2、spark 程序如下:PROGRAM 百钱买百鸡()Integer M=100Integer x, y, z, n, kInteger t1, t2t1gettime()For k1 to M do /控制重复次数/n0For x0 to 10
4、0 doFor y0 to 100 doFor z0 to 100 doIf (100-5*x - 3*y)*3= z and x + y + z = 100 Thennn+1print(n, x, y, z)endifrepeatrepeatrepeatrepeatt2gettime()print(t2 - t1)/M) /取计算平均值,消除噪声/END.3、 在 Java 中用 System.currentTimeMillis()获取时间,为抗时间“噪声” ,增加一个数组 a10,将每次结果加到数组中在,降低输出对计算时间的干扰4、 为比较精确计算出每个算法的时间,将每个算法计算 1000
5、00 遍,算出它们的平均值5、 保证每种核心算法外部变量环境和操作方法一致(如在时间的计算方法上,结果的存储,计算的重复次数上一致) ,只改变核心算法,以使几种算法在最终时间效率的比较上比较可靠6、 根据 spark 语言写出对应的 Java 程序,并提出改进方案:为减少环境的其它因素对结果的影响,写出通用的主程序如下public class Baiji public static void main(String args) / TODO Auto-generated method stubint M = 100000;int n = 0, k;int a = new int503;long
6、 t1, t2;t1 = System.currentTimeMillis(); / 开始计时for (k = 0; k M; k+) / 循环计算M 次,得出平均时间n=f1(a); /调用不同的方案,每次运行的时候只需要要将其替换成f1,f2,f3即可3t2 = System.currentTimeMillis(); / 停止计时System.out.println(“计算一次平均耗时:“ + (float) (t2 - t1) / M + “毫秒n共有“ + n+ “种买法“ ); / l输出结果for (int i = 0; i n; i+) System.out.println(“买
7、法“ + i + “-应买公鸡:“ + ai0 + “只,母鸡: “+ ai1 + “只,小鸡:“ + ai2 + “只“);以下是三种核心算法方案一:static int f1(int a) /方案一:int x, y, z;int n=0;for (x = 0; x 100; x+) for (y = 0; y 100; y+) for (z = 0; z 100; z+) if (x + y + z = 100)an1 = y;an2 = z; / 将结果输出保存到一个数组中n += 1; / 结果加一return n;方案二:由于公鸡 5 元一只,母鸡 2 元一只,而小小鸡最多买 10
8、0只,可进一步缩小循环的次数,核心算法如下:static int f2(int a) /方案二:int x, y, z;int n=0;for (x = 0; x = 100/5; x+) for (y = 0; y = 100/3; y+) for (z = 0; z 100; z+) if (x + y + z = 100)an1 = y;an2 = z; / 将结果输出保存到一个数组中n += 1; / 结果加一return n;方案三:分析方案二发现,如果公鸡的只数确定一个后,母鸡的只数范围也随之减小到(100-5*x)/3,而小允的只数则可根据两个条件的一个来确定,再证是否符合条件,
9、这样进一步减小循环次数并去到一层循环:static int f3(int a) /方案三:int x, y, z;int n=0;for (x = 0; x = 100/5; x+) for (y = 0; y = (100-5*x)/3; y+) z=100-x-y;if ( (100 - 5 * x - 3 * y) * 3 = z) an0 = x;an1 = y;an2 = z; / 将结果输出保存到一个数组中n += 1; / 结果加一return n;实验结果及其分析1、三算法结果除时间外,结果一致:共有 4 种买法4买法 0-应买公鸡:0 只,母鸡:25 只,小鸡:75 只买法
10、1-应买公鸡:4 只,母鸡:18 只,小鸡:78 只买法 2-应买公鸡:8 只,母鸡:11 只,小鸡:81 只买法 3-应买公鸡:12 只,母鸡:4 只,小鸡:84 只2、分析三种算法的时间复杂度,设判断每种买法是否符合条件的时间消耗为单位 1,则第一种需要 1003,第二种为(1003)/(5*3),第三种 20*50/3,可以看出第三种算法的时间开销大大降低。3、运行程序,得出三种算法所消耗的时间:算法一 算法二 算法三所用时间(毫秒) 0.70567 0.05009 8.9E-4可以看出前两种算法的实际时间消耗与第 2 步所计算的时间效率之比大约一致(约为1:15) ,但第三种算法虽然效率大大增加,但也没有理论的那个大,观察在第三个算法是增加一个计算 z 并赋值的步骤,可以初步分析这是赋值操作为时间开销的影响。4、通过分析数据规律,它所处的空间,可以有效的减少算法的循环,计算和判断次,提高程序执行的效率。