时间复杂度的基本概念是按照某一个函数执行所需要的次数来计算的,那如下函数打比方:
void Test(int n)
{
int iConut = 0;
for(int i = 0; i < n; ++i) //for循环n次
{
for(int j = 0; j < n; ++j) //for循环n次
{
iCount++;
}
}
for(int k = 0; k < 2*n; ++k) //for循环2n次
{
iCount++;
}
int count = 10;
while(count--) //while循环10次
{
iCount++;
}
}
第一个for循环是一个双层嵌套循环,两层循环均是n次,所以第一个for循环是n^2次,第二个for循环2n次,第三个while循环10次,所以语句执行的总次数为f(n)=n^2+2n+10次,即该函数的时间复杂度为f(n)。
当然也会有人问为什么不用执行的时间来代表时间复杂度,这里个人理解是,在函数调用的过程中要开辟栈帧存放临时变量,语句不同,循环次数不同都会影响函数执行所需要的时间,而且这个时间没有一个统一的标准,所以很难用时间来表示时间复杂度。
O渐进表示法
1.用常数1取代运行时间中的所有加法常数 在修改后的运行次数函数中
2.只保留最高阶项 如果最高阶项系数存在且不是1
3.则去除与这个项相乘的常数
用之前的函数举例,时间复杂度f(n)=n^2+2n+10,那么用O渐进表示法O(f(n))=n^2
递归算法的时间复杂度
递归算法的时间复杂度就等于递归的总次数*每次递归的次数,用如下函数举例说明:
int fun(int n)
{
if(n>1)
{
return n+fun(n-1);
}
return 1;
}
该递归函数的作用是求1+2+3+...+n个数的和,每一次进入函数内部时之执行一个if语句,没有循环语句,所以每一次的递归次数是1。该函数要递归循环n次,总递归次数是n。所以该递归函数的时间复杂度f(n)=n*1=n,用O渐进表示即为O(n)。