数据结构与算法学习笔记(二)
数据结构与算法中,最重要和基础的概念莫过于复杂度分析。复杂度分析从时间和空间维度可以分为时间复杂度分析和空间复杂度分析。平常用的最多的就是时间复杂度分析。
为什么要进行复杂度分析
- 测试结果依赖测试环境
因为现实中不同配置的机器,对于同样规模数据的测试结果不同,在实际结果出来前,需要对程序大致执行的时间以及空间消耗有一个大致的掌握。 - 测试结果受数据规模的影响
不同的数据规模对测试的影响也不一样,小数据样本可能算法的开销成本在不同机器上体现不明显,但当数据成几何倍数增加的时候,我们需要知道算法执行效率的高低,以便设计更有效的算法和数据结果去应对不同的结果。
大O复杂度表示法
表示数据规模,表示执行时间,表示每行代码执行的次数总和。表示与成正比的关系。
注意:大O时间复杂度表示法并不表示代码的具体运行时间,而是代码执行时间随数据规模增长的变化趋势,也叫渐进时间复杂度(asymptotic time complexity)。当数据规模很大时,常量,低阶,系数等部分并不左右增长趋势,在计算时间复杂度的时候可以忽略,只需要记录对数据影响最大的那一个部分。
时间复杂度分析方法
典型的时间复杂度分析方法有以下四种方法,总结如下:
- 只关注循环执行次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
- 乘法法则:嵌套代码的时间复杂度等于嵌套内外代码复杂度的乘积
- 多个规模的不同代码段,求其加法
复杂度量级
主要的复杂度量级有以下7种:
- 常量阶:O(1)
- 指数阶:O()
- 对数阶:O()
- 阶乘阶:O()
- 线性阶:O()
- 线性对数阶: O()
- 平方阶,立方阶
其中,指数阶和阶乘阶,随着数据规模的增大,算法的时间开销急剧增加,将这种时间复杂度为非多项式量级的算法称为NP(None-Deterministic Polynomial) 问题。