目录
本节目标
一、算法效率
二、时间复杂度
1、时间复杂度的概念
2、时间复杂度的表示方法
3、简单时间复杂度的计算
示例一
void Func(int N)
{
int count = 0;
for (int k = 0; k < 100; ++ k)
{
++count;
}
printf("%d\n", count);
}
示例二
void Func1(int N)
{
int count = 0;
for (int i = 0; i < N; ++i)
{
for (int j = 0; j < N; ++j)
{
++count;
}
}
for (int k = 0; k < 2 * N; ++k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
示例三
void Func2(int N)
{
int count = 0;
for (int k = 0; k < 2 * N ; ++ k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
4、复杂时间复杂度的计算
(1)冒泡排序的时间复杂度
void BubbleSort(int arr[], int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
(2)二分查找的时间复杂度
int BinarySearch(int arr[], int n, int x) //n元素个数 x:要查找的数
{
int left = 0;
int right = n - 1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > x)
{
right = mid - 1; //中间元素比x大就挪动right下标
}
else if (arr[mid] < x)
{
left = mid + 1; //中间元素比x小就挪动left下标
}
else
return mid; //找到就返回该元素所在的下标
}
return 0; //找不到就返回0
}
(3)阶乘递归的时间复杂度
long long Factorial(int N)
{
return N < 2 ? N : Factorial(N - 1) * N;
}
以五的阶乘示例:
(4)斐波那契递归的时间复杂度
long long Fibonacci(size_t N)
{
return N < 2 ? N : Fibonacci(N - 1) + Fibonacci(N - 2);
}
五、不同时间复杂度效率的比较
三、空间复杂度
1、空间复杂度的概念
2、空间复杂度的计算方法
3、常见空间复杂度的计算
(1)冒泡排序的空间复杂度
void BubbleSort(int arr[], int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
(2)二分查找的空间复杂度
int BinarySearch(int arr[], int n, int x) //n元素个数 x:要查找的数
{
int left = 0;
int right = n - 1;
while (left < right)
{
int mid = (left + right) / 2;
if (arr[mid] > x)
{
right = mid - 1; //中间元素比x大就挪动right下标
}
else if (arr[mid] < x)
{
left = mid + 1; //中间元素比x小就挪动left下标
}
else
return mid; //找到就返回该元素所在的下标
}
return 0; //找不到就返回0
}
(3)阶乘递归的空间复杂度
long long Factorial(int N)
{
return N < 2 ? N : Factorial(N - 1) * N;
}
(4)斐波那契递归的空间复杂度
long long Fibonacci(size_t N)
{
return N < 2 ? N : Fibonacci(N - 1) + Fibonacci(N - 2);
}
四、总结
- 时间复杂度和空间复杂度都是用大O的渐进表示法来表示。
- 时间复杂度看运算执行的次数,空间复杂度看变量定义的个数。
- 递归时时间复杂度看调用的次数,空间复杂度看调用的深度。
- 冒泡排序的时间复杂度为O(N^2),空间复杂度为O(1)。
- 二分查找的时间复杂度为O(logN),空间复杂度为O(1)。
- 阶乘递归的时间复杂度为O(N),空间复杂度为O(N)。
- 斐波那契递归的时间复杂度为O(2^N),空间复杂度为O(N)。