时间复杂度
就是说这个算法要进行多少次计算,遍历。
空间复杂度就是说这个算法需要用到多少空间内存等。
关于时间复杂度,常见的有O(1),O(n),O(n^2)等;
如果说这个算法的次数是可以确定的,是常数次,比如100次,10000次,那么时间复杂度就是O(1)。
比如:
int main()
{
int n = 1000;
while(n--)
{
printf("hello\n");
}
return 0;
}
可以知道只计算1000次,所以时间复杂度为O(1);
如果是不确定的比如for循环
for(size_t i = 0;i<n;i++)
{
printf("hello\n");
}
像这样一层是n次,时间复杂度O(n)。
如果再嵌套一次。
for(size_t i = 0;i<n;i++)
{j
for(size_t j = 0;j<n;j++)
{
printf("jhello\n");
}
}
就是n*n。时间复杂度O(n^2);
类似三层嵌套就是O(n^3);
类似的,有这样情况:
for(size_t i = 0;i<n;i++)
{
printf("hello\n");
}
for(size_t i = 0;i<n;i++)
{
printf("hello\n");
}
复杂度是n+n = 2n;一般都忽略系数,一律记作O(n);
同样的,如复杂度是n*n +n+n+100;记作O(n^2);
类推其他情况都一样,都看复杂度最高的那一项;
比较特殊的有O(logN),O(2^N);
二分法的时间复杂度为O(logN)
int BinarySearch(int* a, int n, int x)
{
assert(a);
int begin = 0;
int end = n-1;
while (begin < end)
{
int mid = begin + ((end-begin)>>1);
if (a[mid] < x)
begin = mid+1;
else if (a[mid] > x)
end = mid;
else
return mid;
}
return -1;
}
计算费波纳茨算法为O(2^N)
long long Fibonacci(size_t N)
{ return N < 2 ? N : Fibonacci(N-1)+Fibonacci(N-2); }
空间复杂度
是对一个算法在运行过程中临时占用存储空间大小的量度。
因为硬件技术的提高,现在绝大多数情况都拥有足够的空间,所以不常用;
一般直接调用排序算法空间复杂度是O(1) 。而一般的递归算法就要有O(n)的空间复杂度了。
下面是我整理的一些排序复杂度表: