时间复杂度——算法效率的度量
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间度量记 T(N)=O(f(n)),它表示问题规模随n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐近时间复杂度,简称时间复杂度。
时间复杂度的计算方法
- 先找执行次数
- O()
- 加法常数项变为1
- 只保留最高阶项
- 最高阶项系数变为1
例如:
void test0(int n)
{
int icount = 0;
for (int idx = 0; idx < 10; ++idx)
{
icount++;
}
//总执行次数f(n)=10
//时间复杂度:O(1)
void test1(int n)
{
int count = 0;
for (int i = 0; i < 10; ++i)
{
count++;
}
for (int i = 0; i < 2 * n; ++i)
{
count++;
}
}
//总执行次数f(n)=2*n+10
//时间复杂度:O(n)
void test1(int n)
{
int count = 0;
for (int idx = 0; idx < 10; ++idx)
{
count++;
}
for (int idx = 0; idx < 2 * n; ++idx)
{
count++;
}
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
count++;
}
}
}
//总执行次数f(n)=n^2+2*n+10
//时间复杂度:O(n^2)
void test1(int n,int m)
{
int count = 0;
for (int i = 0; i< m; ++i)
{
count++;
}
for (int k = 0;k < n; ++k)
{
count++;
}
}
//总执行次数f(n)=m+n
//时间复杂度:O(m+n)
二分查找的时间复杂度——O(log(N/2))
int bin_search(int arr[],int left,int right,int sz,int key)
{
int mid = 0;
int left = 0;
int right = sz - 1;
while (left < right)
{
mid = left + (right / left) / 2;
if (arr[mid]>key)
right = mid - 1;
else if (arr[mid] < key)
left = mid + 1;
else return mid;//找到了返回下标
}
return -1;//找不到返回-1
}
//时间复杂度:O(log(N/2))
图解:
递归算法的时间复杂度
递归算法的时间复杂度:递归总次数*每次递归的次数
例:求n的阶乘
int fac(int n)
{
if (n <= 1)
return 1;
else
return n*fac(n - 1);
}
//时间复杂度:O(N)
图解:
空间复杂度——算法的存储空间的度量
空间复杂度:函数中创建对象的个数关于问题规模函数表达式,一般情况下用O的渐近表示法表示
例如:
int sum(int N)
{
int count = 6;
for (int i = 0; i <= N;++i)
count += 1;
return count;
}
//空间复杂度:O(1)
斐波那契的空间复杂度
long long fib(int n)
{
if (n < 3)
{
return 1;
}
return fib(n - 1) + fib(n - 2);
}
//空间复杂度:O(N)
//时间复杂度:O(2^N)
空间复杂度图解:
时间复杂度图解: