复杂度分析

本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程

数据结构和算法 解决快与省的问题 即如何让代码运行的更快,如何让代码更省存储空间

复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系

事后统计法,也就是跑一遍代码,就可以得到执行时间和占用内存大小。其局限性在于:结果非常依赖测试环境,比如处理器不同,硬件不同,导致结果可能不一样。还有一点是测试结果受数据规模的影响很大

大O复杂度表示法
所有代码的执行时间,与每行代码的执行次数成正比
T(n) = O(f(n))

常量、系数三部分并不左右增长趋势,只需要记录一个最大级就可以了,
T (n) = O (n); T(n)= O(n^2)

时间复杂度分析
只关注循环次数最多的一段代码

加法法则:总复杂度等于量级最大的那段代码的复杂度
T(n) =O(max(f(n), g(n)))

乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
T(n)=O(f(n)*g(n))

常用的复杂度级别?
多项式阶:随着数据规模的增长,算法的执行时间和空间占用,按照多项式的比例增长。包括,
O(1)(常数阶)、O(logn)(对数阶)、O(n)(线性阶)、O(nlogn)(线性对数阶)、O(n2)(平方阶)、O(n3)(立方阶)
非多项式阶:随着数据规模的增长,算法的执行时间和空间占用暴增,这类算法性能极差。包括,
O(2^n)(指数阶)、O(n!)(阶乘阶)

O(1): 一般情况下,只要算法中下存在循环语句、递归语句,即使成千上万行的代码,其时间复杂度也是O(1)。

O(logn) O(nlogn)
对数阶的复杂度很常见,但比较难分析。看下面的一段伪代码

for(int i = 1; i < n; i++)[
	i = i * 2;
}

i 的值是一个等比数列,首项为1,公比为2,如果代码运行的次数为x ,则2^x = n 可得出x = log2n。它的复杂度就是O(log2n) 根据对数的性质,log2n = logn * 常数,对于时间复杂度,常数可省略。得到此伪代码的复杂度 O(logn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值