实验1 算法效率与时空复杂度检验

实验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块钱刚好买100只鸡,问有多少种买法,每种买法中公鸡、母

鸡、小鸡的数量各为多少?设计一个实验方案,验证求解此问题的算法的正确

性,比较并分析各算法的优劣。

c)设计实验方案。方案中应包括

i.多种问题求解算法

ii.算法执行时间获取方法

iii.抗时间“噪声”方法

iv.时间结果分析对比方法

d)根据算法和实验方案设计实验程序

e)设计求解此问题的多种算法,并将它们转换成相应程序。

f)分析各算法(程序)的特点,比较它们的优劣。

g)安装程序设计语言系统。

h)输入各个程序,验证它们的正确性。

i)设计并运行能统计各程序执行时间并能抗“噪声”的程序,统计各算法的时间开

销,并与之前所做的理论分析比较,看是否一致。

实验环境

硬件:Intel(R) Pentium(R) CPU RAM:4G

软件:Myeclipse2013

实验前准备

1、算法设计:见实验步骤2

2、程序设计:见实验步骤3

实验步骤

1、利用spark语言写出初步的算法,再用java作为程序实现语言,实验利用的IDE为myelcipse2013,若直接在机器上编译运行需要安装JDK

2、spark程序如下:

PROGRAM 百钱买百鸡()

Integer M=100

Integer x, y, z, n, k

Integer t1, t2

t1 gettime()

For k←1 to M do //控制重复次数//

n←0

For x←0 to 100 do

For y←0 to 100 do

For z←0 to 100 do

If (100-5*x - 3*y)*3= z and x + y + z = 100

Then

n←n+1

print(n, x, y, z)

endif

repeat

repeat

repeat

repeat

t2←gettime()

print((t2 - t1)/M) //取计算平均值,消除噪声//

END.

3、在Java中用System.currentTimeMillis()获取时间,为抗时间“噪声”,增加

一个数组a[][10],将每次结果加到数组中在,降低输出对计算时间的干扰4、为比较精确计算出每个算法的时间,将每个算法计算100000遍,算出它

们的平均值

5、保证每种核心算法外部变量环境和操作方法一致(如在时间的计算方法

上,结果的存储,计算的重复次数上一致),只改变核心算法,以使几种算法在最终时间效率的比较上比较可靠

6、根据spark语言写出对应的Java程序,并提出改进方案:

为减少环境的其它因素对结果的影响,写出通用的主程序如下

public class Baiji {

public static void main(String[] args) {

// TODO Auto-generated method stub

int M = 100000;

int n = 0, k;

int[][] a = new int[50][3];

long t1, t2;

t1 = System.currentTimeMillis(); // 开始计时

for (k = 0; k < M; k++) { // 循环计算M次,得出平均时间

n=f1(a);//调用不同的方案,每次运行的时候只需要要将其替换成f1,f2,f3即可

}

t2 = System.currentTimeMillis(); // 停止计时

System.out.println("计算一次平均耗时:" + (float) (t2 - t1) / M + "毫秒\n共有

" + n

+ "种买法"); // l输出结果

for (int i = 0; i < n; i++) {

System.out.println("买法" + i + "--应买公鸡:" + a[i][0] + "只,母鸡:"

+ a[i][1] + "只,小鸡:" + a[i][2] + "只");

}

}

以下是三种核心算法

方案一:

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)

&& ((100 - 5 * x - 3 * y) * 3 == z)) {

a[n][0] = x;

a[n][1] = y;

a[n][2] = z; // 将结果输出保存到一个数组中

n += 1; // 结果加一

}

}

}

}

return n;

}

}

方案二:由于公鸡5元一只,母鸡2元一只,而小小鸡最多买100

只,可进一步缩小循环的次数,核心算法如下:

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)

&& ((100 - 5 * x - 3 * y) * 3 == z)) {

a[n][0] = x;

a[n][1] = y;

a[n][2] = z; // 将结果输出保存到一个数组中

n += 1; // 结果加一

}

}

}

}

return n;

}

方案三:分析方案二发现,如果公鸡的只数确定一个后,母鸡的只数

范围也随之减小到(100-5*x)/3,而小允的只数则可根据两个条件的一

个来确定,再证是否符合条件,这样进一步减小循环次数并去到一层

循环:

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)) {

a[n][0] = x;

a[n][1] = y;

a[n][2] = z; // 将结果输出保存到一个数组中

n += 1; // 结果加一

}

}

}

return n;

}

实验结果及其分析

1、三算法结果除时间外,结果一致:

共有4种买法

买法0--应买公鸡:0只,母鸡:25只,小鸡:75只

买法1--应买公鸡:4只,母鸡:18只,小鸡:78只

买法2--应买公鸡:8只,母鸡:11只,小鸡:81只

买法3--应买公鸡:12只,母鸡:4只,小鸡:84只

2、分析三种算法的时间复杂度,设判断每种买法是否符合条件的时间消耗为单位1,则第一种需要100^3,第二种为(100^3)/(5*3),第三种20*50/3,可以看出第三种算法的时间开销大大降低。

15),但第三种算法虽然效率大大增加,但也没有理论的那个大,观察在第三个算法是增加一个计算z并赋值的步骤,可以初步分析这是赋值操作为时间开销的影响。

4、通过分析数据规律,它所处的空间,可以有效的减少算法的循环,计算和判断次,提高程序执行的效率。

算法时间复杂度的计算

算法时间复杂度的计算 [整理] 基本的计算步骤 时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次数T(n) 基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。 2. 计算出T(n)的数量级 求T(n)的数量级,只要将T(n)进行如下一些操作: 忽略常量、低次幂和最高次幂的系数 令f(n)=T(n)的数量级。 3. 用大O来表示时间复杂度 当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。 一个示例: (1) int num1, num2; (2) for(int i=0; i

排序算法时间复杂度比较

排序算法比较 主要容: 1)利用随机函数产生10000个随机整数,对这些数进行多种方法排序。 2)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结功能果保存在不同的文件里。 3)给出该排序算法统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 程序的主要功能: 1.随机数在排序函数作用下进行排序 2.程序给出随机数排序所用的时间。 算法及时间复杂度 (一)各个排序是算法思想: (1)直接插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。 (2)冒泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的

关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。 (3)快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (4)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选出关键字最小的记录,并和第I(1<=I<=N)个记录交换。 时间复杂度分析

10000个数据的时间比较: 程序源代码: /********************************************************************************************** package test; public class SortArray { private static final int Min = 1;//生成随机数最小值 private static final int Max = 10000;//生成随机数最大值 private static final int Length = 10000;//生成随机数组长度(测试的朋友建议不要超过40000,不然你要等很久,如果你电脑配置绝对高的情况下你可以再加个0试试) public static void main(String[] args) { System.out.println("数组长度:"+Length+", Min:"+Min+", Max:"+Max); long begin; long end; int arr[] = getArray(Length);

算法分析与设计实验指导书

《算法分析与设计》实验指导书本书是为配合《算法分析与设计实验教学大纲》而编写的上机指导,其目的是使学生消化理论知识,加深对讲授容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。 上机实验一般应包括以下几个步骤: (1)、准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机。(2)、上机输入和调试自己所编的程序。一人一组,独立上机调试,上机时出现的问题,最好独立解决。 (3)、上机结束后,整理出实验报告。 实验报告应包括: 1)问题分析 2)算法描述 3)运行结果、 4)算法性能分析。 实验一 实验名称:贪心算法应用及设计 实验学时:6学时 实验类型:验证 实验目的: 1.理解贪心算法的基本思想 2.掌握利用贪心算法求解问题的求解步骤 实验容 1.活动选择问题(2学时) 问题描述: 设有11个会议等待安排,用贪心法找出满足目标要求的会议集合,这些会议按结束时间的非减序排列如下表。 实验实现提示: 1)数据结构设计: 将会议开始时间存储在数组B中,结束时间存储在数组E中,数组下标为会议的代码。结果存储在数组A中,其元素A[i]==true,表示会议i被选中。 2)算法: void GreedySelect(int n, struct time B[], struct time E[], bool A[]) { int i,j;

A[1]=true; j=1; i=2; while( i<=n) if (B[i]>=E[j]) { A[i]=true; j=i;} else A[i]=false; } 思考题:证明所得的解是最优解? 2.单源点最短路径问题。(2学时) 问题描述 如图所示的有向带权图中,求源点0到其余顶点的最短路径及最短路径长度。并对算法进行性能分析。 实现提示 1)数据结构设计: 将图存储在邻接矩阵C中,结点个数为n,源点编号为u, 源点u到其余顶点的最短路径长度存储在dist[],最短路径存储在p[]。 2) 算法 void Dijkstra(int C[n][n], int n,int u,float dist[],int p[]) { bool s[n]; for( int i=1; i<=n; i++) { dist[i]=C[u][i]; s[i]=false; if (dist[i]=∞) p[i]=-1; else p[i]=u; } p[u]=-1; s[u]=true; for( i=1; i<=n; i++) { int temp= ∞; int t=u; for( int j=1;j<=n;j++)

算法的时间复杂性

算法的时间复杂度计算 定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。 我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。 此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。 “大O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长。 这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。例如,一个低附加代价的O(n2)算法在n较小的情况下可能比一个高附加代价的 O(nlogn)算法运行得更快。当然,随着n足够大以后,具有较慢上升函数的算法必然工作得更快。 O(1) Temp=i;i=j;j=temp; 以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。 O(n^2) 2.1. 交换i和j的内容 sum=0;(一次) for(i=1;i<=n;i++) (n次) for(j=1;j<=n;j++) (n^2次) sum++;(n^2次) 解:T(n)=2n^2+n+1 =O(n^2) 2.2. for (i=1;i

算法设计与分析实验报告贪心算法

算法设计与分析实验报告 贪心算法 班级:2013156 学号:201315614 姓名:张春阳哈夫曼编码 代码 #include float small1,small2; int flag1,flag2,count; typedefstructHuffmanTree { float weight; intlchild,rchild,parent; }huffman; huffmanhuffmantree[100]; void CreatHuffmanTree(intn,int m) { inti; void select(); printf("请输入%d个节点的权值:",n); for(i=0;i

printf("\n"); for(i=0;i

最大公约数的三种算法复杂度分析时间计算

昆明理工大学信息工程与自动化学院学生实验报告 ( 2011 —2012 学年第 1 学期) 一、上机目的及内容 1.上机内容 求两个自然数m和n的最大公约数。 2.上机目的 (1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法; (3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) (1)至少设计出三个版本的求最大公约数算法; (2)对所设计的算法采用大O符号进行时间复杂性分析; (3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及VISUAL C++软件 四、实验方法、步骤(或:程序代码或操作过程) 实验采用三种方法求最大公约数 1、连续整数检测法。 2、欧几里得算法 3、分解质因数算法 根据实现提示写代码并分析代码的时间复杂度: 方法一: int f1(int m,int n) { int t; if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; } return t; } 根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2; 方法二:int f2(int m,int n) {

r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return n; } 根据代码辗转相除得到欧几里得的O(n)= log n 方法三: int f3(int m,int n) { int i=2,j=0,h=0; int a[N],b[N],c[N]; while(i

排序算法时间复杂度比较

排序算法比较 主要内容: 1)利用随机函数产生10000个随机整数,对这些数进行多种方法排序。 2)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结功能果保存在不同的文件里。 3)给出该排序算法统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 程序的主要功能: 1.随机数在排序函数作用下进行排序 2.程序给出随机数排序所用的时间。 算法及时间复杂度 (一)各个排序是算法思想: (1)直接插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。 (2)冒泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的

关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。 (3)快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (4)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选出关键字最小的记录,并和第I(1<=I<=N)个记录交换。 时间复杂度分析 排序算法最差时间时间复杂度是否稳定? 插入排序O(n2) O(n2) 稳定冒泡排序O(n2) O(n2) 稳定快速排序O(n2) O(n*log n) 不稳定 2 选择排序O(n2) O(n2) 稳定

算法分析与设计实验报告

算法设计与分析 学院:计算机科学与技术 学号:129074106 姓名:张淼淼 2014 11 14

1、 当问题规模100 N 时,快速排序和插入排序各需多少时间?写清机器配置,列出五种 快速排序所需时间(ms) 插入排序所需时间(ms ) 两者相差多少 N=100 0.00600 0.019000 -0.013000 N=1000 0.074000 0.724000 -0.650000 N=10000 0.032000 64.657000 -64.625000 N=100000 13.300000 50.900000 -37.600000 N=1000000 53.500000 117.700000 -64.200000 Window 7 32位 Cpu :Inter(R) Core(TM) i3-2120 cpu@3.30GHz AMD Radeon HD 6450 Graphics

程序: #include #include #include #include int a[1000000];

int b[1000000]; void QuickSort(int low ,int high) { long i,j; int x; i=low; j=high; x=a[i]; while(i=x&&i(j+1)) QuickSort(j+1,high); } void BinaryInsertSort(int length) { int low,high,mid; int i,j,m;//m为保存待插入的元素 for(i=1;i=b[mid]) low=mid+1; else high=mid-1; } for(j=i-1;j>=high+1;j--)//high为插入位置 b[j+1]=b[j];//后移元素,留出插入的空位b[high+1]=m;//将元素插入正确的位置 }

算法的时间复杂度计算

for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x++; 它的时间复杂度是多少? 自己计算了一下,数学公式忘得差不多了,郁闷; (1)时间复杂性是什么? 时间复杂性就是原子操作数,最里面的循环每次执行j次,中间循环每次执行 a[i]=1+2+3+...+i=i*(i+1)/2次,所以总的时间复杂性=a[1]+...+a[i]+..+a[n]; a[1]+...+a[i]+..+a[n] =1+(1+2)+(1+2+3)+...+(1+2+3+...+n) =1*n+2*(n-1)+3*(n-2)+...+n*(n-(n-1)) =n+2n+3n+...+n*n-(2*1+3*2+4*3+...+n*(n-1)) =n(1+2+...+n)-(2*(2-1)+3*(3-1)+4*(4-1)+...+n*(n-1)) =n(n(n+1))/2-[(2*2+3*3+...+n*n)-(2+3+4+...+n)] =n(n(n+1))/2-[(1*1+2*2+3*3+...+n*n)-(1+2+3+4+...+n)] =n(n(n+1))/2-n(n+1)(2n+1)/6+n(n+1)/2 所以最后结果是O(n^3)。 【转】时间复杂度的计算 算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学复习起来无从下手,

下面我们就这个问题给各位考生进行分析。 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。 下面我们通过例子加以说明,让大家碰到问题时知道如何去解决。 1、设三个函数f,g,h分别为f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn 请判断下列关系是否成立: (1)f(n)=O(g(n)) (2)g(n)=O(f(n)) (3)h(n)=O(n^1.5) (4)h(n)=O(nlgn) 这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C?f(n)。"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。这么一来,就好计算了吧。 ◆(1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。 ◆(2)成立。与上同理。 ◆(3)成立。与上同理。 ◆(4)不成立。由于当n→∞时n^1.5比nlgn递增的快,所以h(n)与nlgn的比值不是常数,

《算法分析与设计》实验指导书

《计算机算法设计与分析》实验指导书(第一版)

前言 计算机算法分析与设计是面向设计的,它是计算机科学的核心。无论是计算机系统、系统软件和解决计算机的各种应用问题都可归结为算法的设计。通过本课程的学习,使学生掌握计算机领域中许多常用的非数值的算法描述:分治法、贪心法、动态规划、回溯法、分枝限界等算法,并掌握算法分析的方法,从而把学生的分析问题和解决问题能力提高到理论的高度。 前期课程为程序设计语言、数据结构、高等数学,即学生应该具备一门高级语言程序设计编程基础,学习基本的数据结构知识,还要求学生掌握较好的数学基础。 开发环境不限,本书采用C/C++语言的集成开发环境等。 实验完成后书写实验报告,包含实验问题、基本思想、关键算法流程图、测试数据及运行结果(截图)、调试心得和源程序。 总实验学时为16学时。

目录 预备实验验证算法的方法 (4) 实验目的: (4) 实验课时: (4) 实验原理: (4) 实验题目: (6) 基本题: (6) 提高题: (6) 实验一递归与分治 (7) 实验目的: (7) 实验课时: (7) 实验原理: (7) 实验题目: (7) 基本题: (7) 提高题: (8) 思考问题: (8) 实验二动态规划算法 (9) 实验目的: (9) 实验课时: (9) 实验原理: (9) 实验题目: (9) 基本题: (9) 提高题: (10) 思考问题: (10) 实验三贪心选择算法 (11) 实验目的: (11) 实验课时: (11) 实验原理: (11) 实验题目: (11) 基本题: (11) 提高题: (12) 思考问题: (12) 实验四回溯算法 (13) 实验目的: (13) 实验课时: (13) 实验原理: (13) 实验题目: (14) 基本题: (14) 提高题: (14) 思考问题: (14)

算法的时间复杂度

算法的时间复杂度 Prepared on 22 November 2020

时间复杂度:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数,T(n)称为这一算法的“时间复杂度”。渐近时间复杂度:当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂度”。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶 O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。 下面我们通过例子加以说明,让大家碰到问题时知道如何去解决。 1、设三个函数f,g,h分别为 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^+5000nlgn 请判断下列关系是否成立: (1) f(n)=O(g(n)) (2) g(n)=O(f(n)) (3) h(n)=O(n^ (4) h(n)=O(nlgn)

这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤Cf(n)。"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。这么一来,就好计算了吧。 ◆ (1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。 ◆(2)成立。与上同理。 ◆(3)成立。与上同理。 ◆(4)不成立。由于当n→∞时n^比nlgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。 2、设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。 (1) i=1; k=0 while(i

算法时间复杂度计算示例

算法时间复杂度计算示 例 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

基本计算步骤? 示例一:? (1) int num1, num2; (2) for(int i=0; i

常用的排序算法的时间复杂度和空间复杂度

排序法最差时间分析平均时间复杂度稳定度空间复杂度 冒泡排序()() 稳定() 快速排序()(*) 不稳定()() 选择排序()() 稳定() 二叉树排序()(*) 不一顶() 插入排序()() 稳定() 堆排序(*) (*) 不稳定() 希尔排序不稳定() 、时间复杂度 ()时间频度一个算法执行所耗费地时间,从理论上是不能算出来地,必须上机运行测试才能知道.但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费地时间多,哪个算法花费地时间少就可以了.并且一个算法花费地时间与算法中语句地执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中地语句执行次数称为语句频度或时间频度.记为(). ()时间复杂度在刚才提到地时间频度中,称为问题地规模,当不断变化时,时间频度()也会不断变化.但有时我们想知道它变化时呈现什么规律.为此,我们引入时间复杂度概念. 一般情况下,算法中基本操作重复执行地次数是问题规模地某个函数,用()表示,若有某个辅助函数(),使得当趋近于无穷大时,()()地极限值为不等于零地常数,则称()是()地同数量级函数.记作()O(()),称O(()) 为算法地渐进时间复杂度,简称时间复杂度. 在各种不同算法中,若算法中语句执行次数为一个常数,则时间复杂度为(),另外,在时间频度不相同时,时间复杂度有可能相同,如()与()它们地频度不同,但时间复杂度相同,都为(). 按数量级递增排列,常见地时间复杂度有:常数阶(),对数阶(),线性阶(), 线性对数阶(),平方阶(),立方阶(),...,次方阶(),指数阶().随着问题规模地不断增大,上述时间复杂度不断增大,算法地执行效率越低. 、空间复杂度与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间地度量.记作: ()(()) 我们一般所讨论地是除正常占用内存开销外地辅助存储单元规模.讨论方法与时间复杂度类似,不再赘述. ()渐进时间复杂度评价算法时间性能主要用算法时间复杂度地数量级(即算法地渐近时间复杂度)评价一个算法地时间性能. 、类似于时间复杂度地讨论,一个算法地空间复杂度( )()定义为该算法所耗费地存储空间,它也是问题规模地函数.渐近空间复杂度也常常简称为空间复杂度. 空间复杂度( )是对一个算法在运行过程中临时占用存储空间大小地量度.一个算法在计算机存储器上所占用地存储空间,包括存储算法本身所占用地存储空间,算法地输入输出数据所占用地存储空间和算法在运行过程中临时占用地存储空间这三个方面.算法地输入输出数据所占用地存储空间是由要解决地问题决定地,是通过参数表由调用函数传递而来地,它不随本算法地不同而改变.存储算法本身所占用地存储空间与算法书写地长短成正比,要压缩这方面地存储空间,就必须编写出较短地算法.算法在运行过程中临时占用地存储空间随算法地不同而异,有地算法只需要占用少量地临时工作单元,而且不随问题规模地大小而改变,我们称这种算法是“就地"进行地,是节省存储地算法,如这一节介绍过地几个算法都是如此;有地算法需要占用地临时工作单元数与解决问题地规模有关,它随着地增大而增大,当较大时,将占用较多地存储单元,例如将在第九章介绍地快速排序和归并排序算法就属于这种情况.文档收集自网络,仅用于个人学习 如当一个算法地空间复杂度为一个常量,即不随被处理数据量地大小而改变时,可表示为();当一个算法地空间复杂度与以为底地地对数成正比时,可表示为();当一个算法地空司复杂度与成线性比例关系时,可表示为().若形参为数组,则只需要为它分配一个存储由实参传送

算法分析与设计实验指导书

《算法分析与设计》实验指导书 《算法分析与设计》课程是计算机专业的一门必修课程。开设算法分析与设计实验,目的就是为了使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。 《算法分析与设计》课程实验的目的:是为了使学生在课程学习的同时,通过实验环境中的实际操作,对部分算法的具体应用有一个初步的了解,使学生加深了解和更好地掌握《算法分析与设计》课程教学大纲要求的内容。 《算法分析与设计》课程实验的注意事项:在《算法分析与设计》的课程实验过程中,要求学生做到: (1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出 现的情况提前作出思考和分析。 (2)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分 析。 (3)遵守机房纪律,服从辅导教师指挥,爱护实验设备。 (4)实验课程不迟到。如有事不能出席,所缺实验一般不补。 《算法分析与设计》课程实验的验收:实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行和即时提问。第二部分是提交电子的实验报告。

实验一算法实现一 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对分治法、贪心算法的理解。 二、实验内容: 掌握分治法、贪心算法的概念和基本思想,并结合具体的问题学习如何用相应策略进行求解的方法。 三、实验题 1. 【伪造硬币问题】给你一个装有n个硬币的袋子。n个硬币中有一个是伪造的。你的 任务是找出这个伪造的硬币。为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。试用分治法的思想写出解决问题的算法,并计算其时间复杂度。 2.【找零钱问题】一个小孩买了价值为33美分的糖,并将1美元的钱交给售货员。售 货员希望用数目最少的硬币找给小孩。假设提供了数目有限的面值为25美分、10美分、5美分、及1美分的硬币。给出一种找零钱的贪心算法。 a)实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 整理出实验报告。 四、实验程序 五、实验结果 六、实验分析

几种排序的算法时间复杂度比较

几种排序的算法时间复杂度比较 1.选择排序:不稳定,时间复杂度 O(n^2) 选择排序的基本思想是对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。这样,经过i遍处理之后,前i个记录的位置已经是正确的了。 2.插入排序:稳定,时间复杂度 O(n^2) 插入排序的基本思想是,经过i-1遍处理后,L[1..i-1]己排好序。第i遍处理仅将L[i]插入L[1..i-1]的适当位置,使得L[1..i] 又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较L[i]和L[i-1],如果L[i-1]≤ L[i],则L[1..i]已排好序,第i遍处理就结束了;否则交换L[i]与L[i-1]的位置,继续比较L[i-1]和L[i-2],直到找到某一个位置j(1≤j≤i-1),使得L[j] ≤L[j+1]时为止。图1演示了对4个元素进行插入排序的过程,共需要(a),(b),(c)三次插入。 3.冒泡排序:稳定,时间复杂度 O(n^2) 冒泡排序方法是最简单的排序方法。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。显然,处理一遍之后,“最轻”的元素就浮到了最高位置;处理二遍之后,“次轻”的元素就浮到了次高位置。在作第二遍处理时,由于最高位置上的元素已是“最轻”元素,所以不必检查。一般地,第i遍处理时,不必检查第i高位置以上的元素,因为经过前面i-1遍的处理,它们已正确地排好序。 4.堆排序:不稳定,时间复杂度 O(nlog n) 堆排序是一种树形选择排序,在排序过程中,将A[n]看成是完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素。 5.归并排序:稳定,时间复杂度 O(nlog n)

最大公约数的三种算法复杂度分析时间计算

理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第 1 学期) 课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日 一、上机目的及容 1.上机容 求两个自然数m和n的最大公约数。 2.上机目的 (1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法; (3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) (1)至少设计出三个版本的求最大公约数算法; (2)对所设计的算法采用大O符号进行时间复杂性分析; (3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及VISUAL C++6.0软件 四、实验方法、步骤(或:程序代码或操作过程) 实验采用三种方法求最大公约数 1、连续整数检测法。

根据实现提示写代码并分析代码的时间复杂度: 方法一: int f1(int m,int n) { int t; if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; } return t; } 根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2; 方法二:int f2(int m,int n) { int r; r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return n; } 根据代码辗转相除得到欧几里得的O(n)= log n 方法三: int f3(int m,int n) { int i=2,j=0,h=0; int a[N],b[N],c[N]; while(i

算法设计与分析实验报告

算法设计与分析实验报告 教师: 学号: 姓名:

实验一:串匹配问题 实验目的:(1) 深刻理解并掌握蛮力法的设计思想; (2) 提高应用蛮力法设计算法的技能; (3) 理解这样一个观点: 用蛮力法设计的算法, 一般来说, 经过适度的努力后, 都可以对算法的第一个版本进行一定程度的改良, 改进其时间性能。 三、实验要求:( 1) 实现BF 算法; (2 ) 实现BF 算法的改进算法: KMP 算法和BM 算法; (3 ) 对上述 3 个算法进行时间复杂性分析, 并设计实验程序验证 分析结果。 #include "stdio.h" #include "conio.h" #include //BF算法 int BF(char s[],char t[]) { int i; int a; int b; int m,n; m=strlen(s); //主串长度 n=strlen(t); //子串长度 printf("\n*****BF*****算法\n"); for(i=0;i

给出以下算法的时间复杂度

第1章绪论 1、填空题 1.常见的数据结构有_________结构,_________结构,_________结构等三种。 2.常见的存储结构有_________结构,_________结构等两种。 3.数据的基本单位是_________,它在计算机中是作为一个整体来处理的。 4.数据结构中的结构是指数据间的逻辑关系,常见的结构可分为两大类,_________和_________。 2、应用题 1、给出以下算法的时间复杂度. void fun(int n) { int i=1,k=100; while(i

while(inext=p->next; p->next=s; (B)p->next=s; s->next=p->next;

算法时间复杂度

算法时间复杂度 The final edition was revised on December 14th, 2020.

实验一算法的时间复杂度 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对算法分析基础知识的理解。 二、实验内容: 掌握算法分析的基本方法,并结合具体的问题深入认识算法的时间复杂度分析。三、实验题 定义一个足够大的整型数组,并分别用起泡排序、简单选择排序、快速排序和归并排序对数组中的数据进行排序(按从小到大的顺序排序),记录每种算法的实际耗时,并结合数据结构中的知识对算法的时间复杂度分析进行说明。实验数据分两种情况: 1、数组中的数据随机生成; 2、数组中的数据已经是非递减有序。 四、实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 整理出实验报告。 五、实验程序 #include #include<> #include<> using namespace std; void SelectSort(int r[ ], int n) { int i; int j; int index; int temp; for (i=0; i

相关文档
最新文档