一、算法分析
1.算法的时间复杂度分析
1.1时间复杂度的两种分析方法
事后分析法:
分析较为简单,但是可能会受设备等因素的影响对时间的测试结果造成影响
事前分析法
消耗的时间取决于下列因素:
1.算法采用的策略和方案;(程序员可以干预的)
2.编译产生的代码质量;(程序员无非去控制)
3.问题的输入规(所谓的问题输入规模就是输入量的多少);(也能够控制)
4.机器执行指令的速度;(程序员也无非进行干预)
所以我们在使用事前分析法时要考虑的是哪种算法,算法规模
分析一个算法的运算时间,最重要的就是把核心操作次数和输入规模联系起来
1.1.1函数渐进增长:
概念:给定两个函数f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,那么我们说f(n)的增长渐近快于g(n)。
算法时间复杂度的规则:
1.算法函数中的常数可以忽略;
2.算法函数中最高次幂的常数因子可以忽略;
3.算法函数中最高次幂越小,算法效率越高。
1.1.2算法的时间复杂度
1.1.2.1大O记法
用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着输入规模n的增大,T(n)增长最慢的算法为最优算法。
大O记法表示复杂度的方法规则:
1.用常数1取代运行时间中的所有加法常数;
2.在修改后的运行次数中,只保留高阶项;
3.如果最高阶项存在,且常数因子不为1,则去除与这个项相乘的常数;
1.1.2.2常见的大O阶
他们的复杂程度从低到高依次为:0(1)<0(logn)<0h)<0(nlogn)<0(n^2)<0(n^3)
根据前面的折线图分析,我们会发现,从平方阶开始,随着输入规模的增大,时间成本会急剧增大,所以,我们的算法,尽可能的追求的是O(1),O(logn),O(n),O(nlogn)这几种时间复杂度。
而如果发现算法的时间复杂度为平方阶、立方阶或者更复杂的,那我们可以分为这种算法是不可取的,需要优化。
1.1.2.4最坏情况
2.算法的空间复杂度分析
2.1java中常见内存占用
1.一个引用(机器地址)需要8个字节表示:例如:Datedate=newDate(),则date这个变量需要占用8个字节来表示
2.创建一个对象,比如newDate(),除了Date对象内部存储的数据(例如年月日等信息)占用的内存,该对象本身也有内存开销,每个对象的自身开销是16个字节,用来保存对象的头信息。
3.一般内存的使用,如果不够8字节,都会被自动填充为8字节
4.java中数组被被限定为对象,他们一般都会因为记录长度而需要额外的内存,一个原始数据类型的数组一般需要24字节的头信息(16个自己的对象开销,4字节用于保存长度以及4个填充字节)再加上保存值所需的内存。