【算法】算法复杂度
算法通俗的来说就是解决一些问题方法和步骤,那么衡量算法的标准有如下:
1.时间复杂度
时间复杂度也就是通常所说的算法执行所需要耗费的时间,时间越短,算法越好,当然也有解释是程序要执行的次数,而不是程序执行的时间,因为有些机器性能高,程序执行的速度快,二有些机器性能一般执行就慢,所以这里就不能用时间来衡量一个算法的好坏。一个算法执行的时间往往无法精确估计,通常需要在实际的计算机中运行才能够知道。但是,我们也可以对算法代码进行估计,而得到算法的时间复杂度。首先,算法代码执行的时间往往和算法代码中语句执行的数量有关。由于每条语句执行都是需要时间的,语句执行的次数越多,整个程序所耗费的时间就越长。因北,筒短、精悍的算法程序往往执行速度快。另外,算法的时间复杂度还与问题的规模有关。
所以评估时间复杂度的算法分析有两种:
1)事后分析评估法
就是去执行要评估的算法代码,在代码运行的开始记下时间,然后等程序运行结束后在记下时间,这个一前一后的时间差就是该算法代码运行的总时间。
事后分析评估法有很大缺点:必须将代码运行一遍之后才知道算法的结果,如果一个算法比较复杂,执行时间长,等运行完之后才发现是一个糟糕的算法,会消耗大量的精力和时间,并且不同的运行环境差吧也是导致测试的结果差异很大。
2)事前分析评估法
在编写要测试的代码之前,根据数据统计方法对算法进行评估。我们发现编写的代码运行所消耗的时间有以下几个因素:
(1)算法采用的策略和方案(人为掌控)。
(2)机器执行指令的速度(人为不可控)。
(3)问题输入的规模(人为不可控)。
(4)编译器是否有对代码进行的优化质量(人为不可控)。
2.空间复杂度
空间复杂度指的是算法程序在计算机中执行所需要消耗的存储空间。空间复杂度其实可以分为如下两个方面程序保存所需要的存储空间,也就是程序的大小。程序在执行过程中所需要消耗的存储空间资源,例如程字在执行过程中的中可变量等。般来说,程序的大小越小,执行过程中消耗的资源越少,这个程序越好。在算法分析中,空间复杂度有更为详细的度量。
下图标识了几种常用算法的复杂度:
下面表格是常见排序算法的算法复杂度
算法 | 最快时间复杂度 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 是否稳定 |
---|---|---|---|---|---|
冒泡排序 | Ω(n) | Θ(n2) | O(n2) | O(1) | 稳定 |
插入排序 | Ω(n) | Θ(n2) | O(n2) | O(1) | 稳定 |
希尔排序 | Ω(nlogn) | Θ(n(log(n))2) | O(n(log(n))2) | O(1) | 不稳定 |
选择排序 | Ω(n2) | Θ(n2) | O(n2) | O(1) | 不稳定 |
堆排序 | Ω(nlogn) | Θ(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | Ω(nlogn) | Θ(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | Ω(nlogn) | Θ(nlogn) | O(n2) | O(logn) | 不稳定 |
基数排序 | Ω(n+b) | Θ(n+b) | O(n+b) | O(n+k) | 稳定 |