您的位置:首页 > 其它

时间复杂度的计算

2017-08-08 12:29 211 查看
时间复杂度可分为以下几种类型:

常数阶,对数阶,线性阶,线性对数阶,平方阶,立方阶,幂次阶(按照幂从小到大),指数阶.我们一一讨论.

其中时间复杂度从小到大为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2^n)

1.常数阶

其中时间复杂度是一个与问题规模n无关的常数,不会趋近于无穷大,有一个确定的值,时间复杂度为O(1).


#include "iostream"
using namespace std;
int main(int argc, char const *argv[])
{
int x = 10, y = 100;
int count = 0;
while (x < 100)
{
if (x < y)
{
y--;
count++;
}
else
{
break;
}
}
cout << count << endl;
return 0;
}


2.对数阶

时间复杂度为对数阶是,一般为算法循环时出现指数的逆运算,时间复杂度为O(log(n)).


#include "iostream"
using namespace std;
const int n = 100;
int main(int argc, char const *argv[])
{
int num = 1, count = 0;
while (num < n)
{
num *= 2;
count++;
}
cout << count << endl;
return 0;
//其中对于num*=2的循环.可以得到2^num=n --->num=log(2)
,所以是对数阶.
}


3.线性阶

线性阶是一个和n成正比的复杂度.时间复杂度表示为O(n).


#include "iostream"
using namespace std;
const int  n = 100;
int main(int argc, char const *argv[])
{
int count = 0;
for (int i = 0; i < n; ++i)
{
count++;
}
cout << count << endl;
return 0;
}


4.线性对数阶

线性对数阶的时间复杂度为O(nlog(n))


#include "iostream"
using namespace std;
const int n = 100;
int main(int argc, char const *argv[])
{
int num=1,count=0;
for (int i = 0; i < n; ++i)
{
while(num<n){
num*=2;
count++;
}
}
cout<<count<<endl;
return 0;
//其中2^num=n^n  ----> num=nlog(2)
.
}


5.幂次阶

幂次阶一般是循环嵌套的形式,循环越多,次数越高,对于嵌套了k次的循环,他的时间复杂度为O(k^n).


#include "iostream"
using namespace std;
const int n = 100;
int main(int argc, char const *argv[])
{
int array

;
int count = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
array[i][j] = 1;
count++;
}
}
cout << count << endl;
return 0;
}


不同的时间复杂度可用下面的图表详细表示:



当问题规模n是可确定时,可根据情况选取不同的时间复杂度算法进行计算.

例如:对于一个问题有两种算法A和B他们的时间分别为O(n)和O(n^2).他们的时间频数的关系可用图来表示:



红色表示算法A蓝色表示算法B.

当n<100时用算法A比较快,当n>100时使用算法B比较快.但是在数量级较小时,他们的时间差可忽略.所以算法A较优.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  时间复杂度