一大早发了个软件版本,又不知道干嘛了,继续看书吧。。。
算法
算法是解决特点问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。
算法的度量方式
有事后统计方法和事前分析估算法。
事后统计就是用记时器统计代码执行的时间。
事前统计就是在依据特点的统计方法对算法进行估算
记得刚毕业找工作那会儿最怕人家问什么时间复杂度空间复杂度的,非科班出身的对这些真的不是太懂。
先看两种算法
int sum =0; //执行一次
int n =100; //执行一次
for(int i=0;i<=n;i++){ //执行n+1次
sum+=i; //执行n次
}
---------------------------------
sum = (1+n)*n/2; //执行一次
System.out.print("sum ="+sum);
这两个算法完成的是同一件事,都是求1加到100的和
但是可以看出第一个算法执行了1+1+n+1+n=2n+3次 而第二个算法加上上面的变量初始化一共执行了 1+1+1=3 次
忽略掉初始化的部分发现这两个算法 就是2n和1的差别,这样看发现算法的作用还是很大的。
这里只是一层循环,当有两层循环时,它会执行nxn次
由此可以发现测定运行时间最可靠的方法就是计算对运行时间有消耗的基本操作的执行次数,运行时间和这个计数是成正比的。
算法时间复杂度定义
在进行算法分析是,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级,算法的时间复杂度,也就是算法的时间量度,记做T(n)=O(f(n))。它表示随问题规模n的增长,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度,其中f(n)是问题规模n的某个函数。
用大写O()来体现算法时间复杂度的记法,称为大O记法。
通过这个定义,可以分析上面的两个求和算法时间复杂度分别为O(n),O(1)。
推导大O的方法
1、用常量1取代运行时间中的所有加法常量; 上面的2n+3 就变成了n+1
2、在修改后的运行次数函数中,只保留最高阶项,假如是 n^2+n 就变成了只有n^2
3、如果最高阶项存在且不是1,则去除与这个项相乘的常数 如 2*n^2就变成了n^2;
得到的结果就是大O。
算法空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,
若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作
空间复杂度为O(1).