数据结构与算法分析--算法分析

算法分析

示例:
题目-----将数7652累加1后面9个0次
思路1:累加1后面9个0次

public class Li13{
public static void main(String[] args) {
/*
* 测试乘积,查看程序运行时间(毫秒为单位)
/
long startTime=System.nanoTime();
long firstOperand=7562;
long secondOperand=1000000000;
long prodect=0;
for (long i =secondOperand; i >0; i–) {
// i–运算符放在变量之后,表示先对原来的值进行其他操作,然后再对自己进行修改
prodect=prodect+firstOperand;
}
long endTime=System.nanoTime();
System.err.println(prodect);
System.out.println(“程序运行时间:”+(endTime-startTime)+“纳秒”);
}
}
思路1运行结果:7562000000000
程序运行时间:347281917纳秒
思路2:将1后面9个0累加7562次
package com.anji.lianxi;
public class Li13{
public static void main(String[] args) {
/

* 测试乘积,查看程序运行时间(毫秒为单位)
*/
long startTime=System.nanoTime();
long firstOperand=7562;
long secondOperand=1000000000;
long prodect=0;
for (long i =firstOperand; i >0; i–) {
// i–运算符放在变量之后,表示先对原来的值进行其他操作,然后再对自己进行修改
prodect=prodect+secondOperand;
}
long endTime=System.nanoTime();
System.err.println(prodect);
System.out.println(“程序运行时间:”+(endTime-startTime)+“纳秒”);
}
}
思路2运行结果27562000000000
程序运行时间:121111纳秒
总结:代码的执行是由累加次数过多引起,可见程序的执行算法是相当重要的
度量算法的效率
在实现算法之前度量算法的效率是有必要的。度量内容:时间复杂度,内存复杂度
往往是时间复杂度和内存复杂度不可兼得,但是也可以兼得
(算法的实际需求时间是无法计算的,我们只是用到了一个关于规模的函数,就是说,当时间需求以某种因子增长的时候函数值也是以同样的因子增长,函数值和时间需求成正比)可以忽略。这个函数度量的就是算法的时间需求和如何随问题的规模增长而增长的增长率函数。比较两个算法的增长率函数判断是否更快

估计算法应估计的是最坏执行时间

计算执行时间:
public class Li15{
public static void main(String[] args) {
int sum=0;
for(int i=0;i<1000;i++){
sum=sum+i;
}
}
}
程序执行时间:忽略声明和for循环中的控制内容,一共执行赋值操作1000+1次,加法操作1000次
赋值和加法时间不同,选择两者时间中较大的,假设总次数是n,执行的总时间为:(2n+1)t
不忽略for循环中的控制语句,有1次对i赋值,i比较1000+1次,i加法操作n次,i赋值n次,总时间为1+(n+1)+n+n=(3n+2)t
程序执行时间结论:算法所需时间与2n+1成正比,算法的增长率函数就是2n+1,同理,算法与n2+n成正比,增长率函数就是n2+n。这时可以理解上面的规模的意思,当n的值还能小的时候,就是小规模,算法所需时间差不多,当n的值很大,就是大规模的时候,算法所需时间差异明显。通常情况下,在比较算法的时候只关心增长率函数中起控制作用的项如,n或者n^2
大O表示法:O(n),O(n^2)或者是O(1)
大O:使用g(n)表示f(n),就是说函数f(n)是g(n)阶的和说算法是g(n)阶的相同,大O提供了函数增长率的上界,数学形式是,存在一个正实数c和正整数N,当n大于N时候,存在f(n)<c
g(n),就是说当n足够大的时候,c
g(n)就是他的上界,f(n)至多是g(n)界的
如何计算c和N的值,计算上界的时候要求对应的值应该尽可能的小,一般情况是用f(n)中较大的项代替较小的项
大O的计算形式:
O(k*g(n))=O(g(n))
O(g1(n))+O(g2(n))=O(g1(n)+g2(n))
O(g1(n))O(g2(n))=O(g1(n)g2(n))
大Omega表示法:
当g(n)=O(f(n))的这里写代码片时候,f(n)至少是g(n)阶的,换句话说就是,当存在c和N的时候,f(N)>c
g(n)对于所有的n>N都成立时。时间需求f(n)不小于他的下界c
g(n),大Omega进行分析用来得到算法的最小时间要求

猜你喜欢

转载自blog.csdn.net/qq_41174684/article/details/82627856