- 如何衡量一个算法的好坏?
- 什么是时间复杂度?
- 时间复杂度为什么不使用时间来衡量而使用基本语句的运行次数来衡量?
- 时间复杂度的O渐进表示法
- 时间复杂度的:最优、平均、最差情况,为什么时间复杂度看的是最差情况?
- 如何求解:二分查找、递归求阶乘、递归斐波那契的时间复杂度?
- 什么是空间复杂度?
- 如何求空间复杂度? 普通函数&递归函数
- 分析递归斐波那契数列的:时间、空间复杂度,并对其进行优化,伪递归优化—>循环优化
- 总结常见时间复杂度
解答:
1.时间复杂度(衡量的是一个算法的运行速度)和空间复杂度(衡量一个算法所需要额外空间)
2.算法操作中的基本操作的执行次数
3.一个算法执行所花费的时间,在理论上是不能算出来的,需要上机测试才可以计算,这样就很麻烦,但是一个算法所花费的时间和执行次数是成正比的,所以利用时间复杂度来衡量。
4.1)用常数1取代运行时间中的所有加法常数
2)在修改后的运行次数函数中,只保留最高项
3)如果最高享存在且不是1、则去除与这个项目相乘的常熟,得到的结果就是大O阶
5.最差情况运行时间是一种保证,那就是运行时间不会再差了
6(1)//用二分法判断某个值是否存在
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <stdio.h>
int BinarySearch(int*a, int size, int x)
{
int left = 0;
int right = size - 1;
int mid;
while (left <= right)
{
mid = (left + (right - left) / 2);
if (a[mid] < x)
left = mid + 1;
else if (a[mid] > x)
right = mid - 1;
else
{
return mid;
}
}
return -1;
```}基本操作执行最好一次,最坏是O(logN),所以时间复杂度是O(N);注意此时log或lg都是指底数为2。
(2)//计算阶乘Factorial
```c
long long Factorial(size_t n)//size_t和int其实差不多一个意思
{
return < 2 ? N : Factorial(N - 1)*N;```
}基本操作执行N次,所以时间复杂度O(N);空间复杂度O(N);
(3)//计算斐波那契数列Fibonacci
```c
long long Fibonacci(size_t N
{
return < 2 ? N : Fibonacci(N - 1) + Fibonacci(N - 2);```
})时间复杂度是O(2^N);空间复杂度O(N);
7.空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
8.大O渐进表示法
9.(1)常数型、O(log2^n)对数型、O(n)线性型、 O(nlog2 ^n)二维型、O(n ^2)平方型,O(n ^3)立方型、O(2 ^n)指数型。