数据结构--时间复杂度和空间复杂度
时间复杂度
–函数执行时的基本操作次数
求解过程
- 1.先找数学表达式(嵌套循环为乘法),并代入O( )中
- 2.加法中的常数用1取代
- 3.只保留表达式中最高阶
- 4.把最高阶系数变为1
注意:
在实际中我们通常情况考虑的是算法的最坏情况;
空间复杂度
–算法的储存空间需求
注意
一个程序在运行时除了需要寄存本身所用代码,常数,变量和输入数据的储存空间外,也需要一些对数据进行操作的工作单元和储存一些为实现计算机所需信息的辅助空间
;这里强调的是辅助空间
。
-----------------------举例---------------------------
1.二分查找
代码:
int BinarySearch(int* array, int size, int data)
{
int left = 0;
int right = size;
int mid = 0;
while (left < right)
{
mid = left + ((right - left) >> 1);
if (data == array[mid])
return mid;
else if (data < array[mid])
right = mid;
else
left = mid + 1;
}
return -1;
}
时间复杂度:O(log2 N)
空间复杂度:O(1)
2.斐波那契数列
方案一:递归实现
long long Fib1(int n)
{
return (n < 2) ? 1 : Fib1(n - 1) + Fib1(n - 2);
}
时间复杂度:O(n*n)
空间复杂度:O(n)
方案二:递归实现
long long Fib2(long long first, long long second, int n)
{
if (n < 2)
return 1;
if (n == 2)
return first + second;
return Fib2(second, first + second, n - 1);
}
时间复杂度:O(n)
空间复杂度:O(n),若为尾递归则为O(1)
方案三:循环实现
long long Fib3(int n)
{
long long first = 1;
long long second = 1;
long long ret = 1;
int i = 2;
for (; i <= n; ++i)
{
ret = first + second;
first = second;
second = ret;
}
return ret;
}
时间复杂度:O(n)
空间复杂度:O(1)