基于数学建模的数据拟合和检验,完成对于gcd(m,n)的算法,做一个基于时间记录的实验,确定它们的效率类型
假设本题需要,对于gcd(m,n)的算法,做一个基于时间记录的实验,确定它们的效率类型
一、利用Java自带的System.currentTimeMillis();获取程序运行的时间。
二、为避免人为主观因素的影响,利用Java自带的(int)(Math.random()*100)+1;产生随机数进求余。
三、为了避免偶然性,将多次记录执行时间,取平均值。
四、利用SPSS,将所得数据进行正态性检验,查看执行时间t是否满足正态分布。
五、当执行时间t满足正态分布时,利用SPSS将所得数据进行Pearson检验,查看是否可以拟合出效率函数。
六、当Pearson检验通过后,利用Matlab的cftool工具做效率类型分析,并得出效率函数。
七、通过Matlab进行残差分析,判定拟合效率函数是否可行。
八、最后得出结论。
对于一和二:利用Java自带的System.currentTimeMillis();获取程序运行的时间。为避免人为主观因素 的影响,利用Java自带的(int)(Math.random()*100)+1;产生随机数进求余。
Java代码
import java.util.*; public class Test { //用于计算gcd(m,n)的欧几里得算法 public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); long startTime = System.currentTimeMillis(); for(int m=1;m<100000;m++) { System.out.println("最大公约数为:" + gcd((int)(Math.random()*100+1),(int)(Math.random()*100+1))); } long endTime = System.currentTimeMillis(); System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); } public static int gcd(int m,int n) { int r = 1; while(n != 0) { r = m%n; m = n; n = r; } return m; } }
对于三:为了避免偶然性,将多次记录执行时间,取平均值。
为了避免偶然性,将程序执行多次取平均值
当循环10000次时程序运行时间为:
平均值为:139ms
当循环20000次时程序运行时间为:
平均值为:206ms
当循环30000次时程序运行时间为:
平均值为:274ms
当循环40000次时程序运行时间为:
平均值为:368ms
当循环50000次时程序运行时间为:
平均值为:424ms
对于四:利用SPSS,将所得数据进行正态性检验,查看执行时间t是否满足正态分布。
SPSS检验结果如下:
结论:因为Sig = 0.200 > 0.05所以执行时间t满足正态分布
对于五:当执行时间t满足正态分布时,利用SPSS将所得数据进行Pearson检验,查看是否可以拟合出效率函数。
n与t的相关系数为0.998
结论:输入变量n与执行时间t的线性相关程度大,可用线性函数拟合。
对于六:当Pearson检验通过后,利用Matlab的cftool工具做效率类型分析,并得出效率函数。
Matlab代码
%拟合代码 >> t = [139 206 274 368 424]; >> n = [10000 20000 30000 40000 50000]; >> cftool(n,t)
结论:Time = 0.00732*x + 62.6
对于七:通过Matlab进行残差分析,判定拟合效率函数是否可行。
%残差分析代码 >> t = t'; >> n =n'; >> k = length(n); >> X=[ones(k,1) n]; >> [b,bint,r,rint,s]=regress(t,X); >> rcoplot(r, rint)
b =
62.6000
0.0073
bint =
31.1469 94.0531
0.0064 0.0083
r =
3.2000
-3.0000
-8.2000
12.6000
-4.6000
rint =
-26.6593 33.0593
-43.5318 37.5318
-44.9468 28.5468
-3.4184 28.6184
-32.7158 23.5158
s =
0.9951 603.4054 0.0001 88.8000
结论:=0.9951,所以Time = 0.00732*x + 62.6作为效率函数是可型的。
对于八:最后得出结论。
结论:因为Time函数为一次函数,所以欧几里得算法的时间复杂度为O(n)。
- C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,
- 《C++第九周实验报告4-1》---建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数, //完成矩阵的输入、输出、加、减、相等判断等操作。
- Flash 与性能实验笔记:几种常用数据类型创建时间
- 那天在CSDN上看到一个网友在华为遇到的面试题是一道乘法题看似简其实并不是因为它们都超出了数据类型的范围,今天做了下加法希望对大家有所启示
- ‘基于时间点的数据存储‘的一个假想
- 给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作: (1)设计一个显示对学生信息操作的菜单函数如下所示: *************************
- 对于orale中的表数据类型的一个简单例子
- 对于一个运行时间为100n*n的算法,要使其在同一台机器上,在比一个运行时间为2^n的算法运行的很快,n的最小值是多少
- 14-9-11 C/C++课程设计--图书馆管理系---<time.h>中时间数据类型的学习记录
- 2.3-7 描述一个运行时间为Θ(nlgn)的算法,给定n个整数的集合S和另一个整数x,该算法能确定S中是否存在两个其和刚好为x的元素
- 算法刷题--用两个栈实现一个队列,完成队列的push、pop操作,队列中的元素为int类型。
- 请给出一个算法,使之对于给定的介于0到k之间的n个整数进行预处理,并能在O(1)时间内,回答出输入的整数中有多少个落在区间[a..b]内,你给出的算法上预处理时间应是O(n+k)。
- 一个表空间有多个数据文件,新增数据时的写入顺序和分配算法初探实验(下)_1
- 对于一个字节(8bit)的无符号整形变量,求二进制表示中“1”的个数,要求算法执行效率尽可能地高
- 对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能地高。
- 时间类型数据存储的效率问题
- Mysql的timestamp类型,自动记录数据的更新时间
- 『算法学习笔记』3rd day. 数据类型实验
- 算法:对于小于1000的随机正整数,通过实验确定期望产生多少个数才能出现重复
- 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案一、摘要 最近在实验里面用台式编写好了一个软件,想移植到家里的笔记本上。在附加数据的时候却出现了错误,具体也没有提示