算法的性能衡量
程序的运行效率:程序解决问题所需要的时间和占用内存的多少
1.时间复杂度
时间频度:
- 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。
- 但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。
一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为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)) 为算法的渐进时间复杂度,简称时间复杂度。
2.空间复杂度
占用内存:
- 一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。
- 一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。
程序执行时所需存储空间包括以下两部分
1.固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间
2.可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。一个算法所需的存储空间用f(n)表示。S(n)=O(f(n)),其中n为问题的规模,S(n)表示空间复杂度
3.各种排序算法性能特点
快速排序是最快的通用排序算法
在大多数实际情况下,快速排序是我们最好的选择
特别是运行时间效率很重要的排序中,就直接选择快速排序
算法排序性能表:
-------------------------------------------------------------------------------------------------------------
算法 | 是否稳定 | 原地排序 | 时间复杂度 | 空间复杂度 | 备注信息 |
---|---|---|---|---|---|
选择排序 | 否 | 是 | \(N^{2}\) | 1 | |
插入排序 | 是 | 是 | \(N\)~\(N^{2}\) | 1 | 取决于元素的排列情况 |
希尔排序 | 否 | 是 | \(NlogN\)? | 1 | |
堆排序 | 否 | 是 | \(NlogN\) | 1 | |
归并排序 | 是 | 否 | \(NlogN\) | $ N $ | |
快速排序 | 否 | 是 | \(NlogN\) | \(lgN\) | 运行效率由概率提供保证 |
三向快速排序 | 否 | 是 | \(N\)~\(NlogN\) | \(lgN\) | 取决于元素的分布情况 |
reference:
1. 2.