算法复杂度
算法复杂度(评估算法优劣一个重要指标)分为时间复杂度和空间复杂度。
时间复杂度是指执行算法所需要的计算工作量,而空间复杂度是指执行这个算法所需要的内存空间。
算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。
一、时间复杂度( Time Complexity )
一个算法所需的运算时间通常与所解决问题的规模大小有关,即与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(
log
2
n
\log_2{n}
log2n)<Ο(n)<Ο(n
log
2
n
\log_2{n}
log2n)<Ο(
n
2
n^2
n2)<Ο(
n
3
n^3
n3) < Ο(
2
n
2^n
2n) < Ο(n!)
总的时间复杂度等于量级最大的那段代码的复杂度
#include <iostream>
using namespace std;
int main(){
int n = 6;//执行1次
for(int i = 0; i < n; i ++)//i=0执行1次 i < n要判断n+1次 i++要执行n次
cout << i << endl;//输出n次
}
/*
时间复杂度为:O(n)
*/
怎么计算一个程序的时间复杂度???
1.忽略常数项。(只有常数项,认为其时间复杂度为O(1))
2.忽略系数。
3.只保留最高项。
/*
1.有循环
1.1 单重循环 直接看循环次数
1.2 多重循环 直接把每重循环次数成乘起来
2.无循环 O(1)
*/
#include <iostream>
using namespace std;
int main(){
int n = 6;
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++)
cout << i ;
cout<<endl;
}
}
/*
时间复杂度为:O(n^2)
相同大小的不同输入值仍可能造成算法的运行时间不同
因此我们通常使用算法的最坏情况复杂度,记为T(n),定义为任何大小的输入n所需的最大运行时间。
*/
嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
几种常见的时间复杂度实例分析:
注: 基本上每个题都有一个极限的数据范围。如果最坏的情况都不会超时说明程序一定不会超时。
二、空间复杂度( Space Complexity )
一个算法的空间复杂度是指程序运行开始到结束所需要的存储空间。包括算法本身所占用的存储空间、输入/输出占用的存储空间以及算法在运行过程中的工作单元和实现算法所需辅助空间。