算法的时间复杂度是一个函数
void Func1(int N) { int count = 0; for (int i = 0; i < N ; ++ i) { for (int j = 0; j < N ; ++ j) { ++count; } }
在里面的的时间复杂度是O(N^2)
遍历一次O(N),这里面两个循环,所以是O(N)*O(N)(其实只是可以这么理解)
当然也可以理解为嵌套都是这样,如果三次嵌套的话就是O(N^3),不用这样的话效率就降低;了,如果你这么工作的话,公司一个会先把你release的
际中我们计算时间复杂度时,我们其实并不一定要计算精确的执行次数,而只需要
大概执行次数,那么这
里我们使用大
O
的渐进表示法。,在这里我们只看他的最高次数。
在实际中一般情况关注的是算法的最坏运行情况,所以数组中搜索数据时间复杂度为
O(N)
题目
第一题
// 计算Func4的时间复杂度? void Func4(int N) { int count = 0; for (int k = 0; k < 100; ++ k) { ++count; } printf("%d\n", count); }
这里面我们没有用到N,所以是O(N),计算机运行速率估计美妙超过10亿次吧(ten billion)
第二题
// 计算BubbleSort的时间复杂度? void BubbleSort(int* a, int n) { assert(a); for (size_t end = n; end > 0; --end) { int exchange = 0; for (size_t i = 1; i < end; ++i) { if (a[i-1] > a[i]) { Swap(&a[i-1], &a[i]); exchange = 1; } } if (exchange == 0) break; } }
ok,冒泡排序O(N^2)直接秒了
第三题
// 计算BinarySearch的时间复杂度? int BinarySearch(int* a, int n, int x) { assert(a); int begin = 0; int end = n-1; // [begin, end]:begin和end是左闭右闭区间,因此有=号 while (begin <= end) { int mid = begin + ((end-begin)>>1); if (a[mid] < x) begin = mid+1; else if (a[mid] > x) end = mid-1; else return mid; } return -1; }
二分查找类型的logN,这里面的底数我们直接忽略就行了,至于为什么你猜(我肯定是知道的,真的)
第四题
// 计算阶乘递归Fac的时间复杂度? long long Fac(size_t N) { if(0 == N) return 1; return Fac(N-1)*N; }
时间复杂度是O(N)
第五题
// 计算斐波那契递归Fib的时间复杂度? long long Fib(size_t N) { if(N < 3) return 1; return Fib(N-1) + Fib(N-2); }
时间复杂度是O(2^n)
空间复杂度
空间复杂度主要通过函数在运行时候显式申请的额外空间来确定,由于其余的对于硬件来说都不算什么
例题1.
// 计算BubbleSort的空间复杂度? void BubbleSort(int* a, int n) { assert(a); for (size_t end = n; end > 0; --end) { int exchange = 0; for (size_t i = 1; i < end; ++i) { if (a[i-1] > a[i]) { Swap(&a[i-1], &a[i]); exchange = 1; } } if (exchange == 0) break; } }
运用了end exchange u=i,用了三个是常数,所以空间复杂度是O(1)
例题2
// 计算Fibonacci的空间复杂度? // 返回斐波那契数列的前n项 long long* Fibonacci(size_t n) { if(n==0) return NULL; long long * fibArray = (long long *)malloc((n+1) * sizeof(long long)); fibArray[0] = 0; fibArray[1] = 1; for (int i = 2; i <= n ; ++i) { fibArray[i] = fibArray[i - 1] + fibArray [i - 2]; } return fibArray; }
这里面malloc开辟了n+1个空间也就是O(N)
例题3
// 计算阶乘递归Fac的空间复杂度? long long Fac(size_t N) { if(N == 0) return 1; return Fac(N-1)*N; }
递归调用N次,每次调用了常数个空间,所以空间复杂度是O(N)