算法复杂度分析

        数据结构和算法的终极目标是“快”和“省”,衡量代码的执行效率,最直接的方法就是把代码跑一遍,通过统计、监控就能得到算法的执行时间和占用内存的情况。但是这样做的问题是测试结果非常依赖测试环境以及测试结果受规模的影响很大。同样的代码,在i3和i7上跑,执行的时间明显不一样。即使在同一台机器上跑,同样的代码得出的统计、监控结果也可能不一样,而且,当有多种算法可供选择时,总不能把每种算法都跑一遍,选择最优算法吧?

        借助算法分析,就可以不用跑代码,实现粗略估计代码执行效率的目标。

        一、时间复杂度

        时间复杂度用来分析代码的执行时间,用大O表示

private function cal(n:int):int{
    var sum:int = 0;
    var i:int = 1;
    for(;i<=n;++i){
        sum = sum + i;
    }
    return sum;
}

这段代码每一行都在执行读数据-运算-写数据的类似操作,用来粗略估计时,可视为每行代码的执行时间为单位时间。

for循环执行++i和sum = sum+i;,所以每执行一次for循环,消耗2个单位时间。再加上进入for循环之前消耗的2个单位时间,故这段代码消耗的时间可以粗略视为2n+2个单位时间

用大O时间复杂度表示法可以写成T(n) = O(2n+2),表示的并不是代码的真正执行时间,表示的是代码执行时间随数据规模增长的变化趋势,也叫渐近时间复杂度,简称时间复杂度。当n很大时,前面的系数可以忽略,所以可以记为T(n) = O(n);

几种常见的时间复杂度

O(1)<O(log n)<O(n)<O(nlog n)<O(n^2)<O(n^3)<O(n^k)<O(2^n)<O(n!)

当代码的复杂度由两个数据规模决定,而这两个数据规模的大小又不能确定时,例如O(m)、O(n),不能确定m、n的大小关系,

这是时间复杂度的写法为T(n) = O(m+n)

时间复杂度分析分为

最好情况时间复杂度:在理想情况下,执行这段代码的时间复杂度

最坏情况时间复杂度:在最糟糕的情况下,执行这段代码的时间复杂度

平均情况时间复杂度:加权平均时间复杂度、期望时间复杂度

均摊时间复杂度:一种特殊的平均时间复杂度

 

        二、空间复杂度

        空间复杂度表示算法的存储空间与数据规模之间的增长关系,全称渐近空间复杂度,简称空间复杂度。

常见的空间复杂度O(1)、O(n)、O(n^2),对于O(log n)、O(n log n)对数阶空间复杂度,很少遇到

虽然代码中已经进行了复杂度分析,但是测试时仍然需要进行性能测试,因为复杂度分析只是提供了一个理论分析,与平台无关,通过性能测试可以帮助选择特定场景下的最优算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章