本篇概念皆是关于时间复杂度
首先需要了解一个概念
时间频度
一个算法中的语句执行次数称为语句频度或时间频度。记为 T(n)。
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多
时间复杂度
n 称为问题的规模,当 n 不断变化时,时间频度 T(n) 也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用 T(n) 表示,若有某个辅助函数 f(n),使得当 n 趋近于无穷大时,T(n) / f(n) 的极限值为不等于零的常数,则称 f(n) 是 T(n) 的同数量级函数。记作 T(n) =O(f(n)). 称 O(f(n)) 为算法的渐进时间复杂度,简称时间复杂度。
常见的时间复杂度有:
常数阶 O(1) < 对数阶 O(log2n) < 线性阶O(n) < 线性对数阶 O(nlog2n) < 平方阶O(n²) < 次方阶O(n³) < k次方阶 O(n^k)
< 指数阶 O(2^n) < O(n!) < O(n^n)
最坏时间复杂度和平均时间复杂度
(1)最坏时间复杂度
即最坏情况运行时间
通常,除非特别指定,我们提到的运行时间都是最坏情况的运行时间
(2) 平均时间复杂度
因此平均情况通常指的是一种数学期望值,而计算数学期望值则需要对输入的分布情况进行假设。平均运行时间很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的
求时间复杂度
(1)计算出基本操作的执行次数T(n)
基本操作即算法中的每条语句的执行次数一般默认为考虑最坏的情况。
(2)计算出T(n)的数量级
求T(n)的数量级,只要将T(n)进行如下一些操作:
忽略常量、低次幂和最高次幂的系数
令f(n)=T(n)的数量级。
(3)用大O来表示时间复杂度
精简步骤:
1. 找到执行次数最多的语句
2. 计算语句执行次数的数量级
3. 用大O来表示结果
除此之外, 算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关