算法11.24

一、算法分析

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个填充字节)再加上保存值所需的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值