算法的复杂度 :
首先,算法的时间复杂度与空间复杂度算法的复杂度。
时间复杂度:
- 计算函数语句总的执行次数与问题规模N的函数表达式。
- 一个算法的最坏情况的运行时间是在任意输入下的运行时间的上限。
- 对于某些算法,最坏的运行情况出现的比较频繁。
- 大体上看,平均情况与最坏情况的运行时间基本一样差。
O渐近表示法:算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作T(n)=O(f(n)),它表示随问题规模n的增大,算法的执行时间的增长率和f(n)的增长率相同,称O(f(n))为算法的渐近时间复杂度,即时间复杂度的O渐近表示法。
O(n)的一般计算方法:
5. 将留下的最高阶的系数换为1。
int x = 1;//时间复杂度为O(1)
- 1
for(int i=0; i<n; i++) { System.out.println(i); }//时间复杂度为O(N)
- 1
- 2
- 3
int n = 8, count = 0;; for(int i=1; i<=n; i *= 2) { count++; } //时间复杂度为O(logN)
- 1
- 2
- 3
- 4
int n = 8, count = 0;; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { count++; } } //时间复杂度为O(N^2)
- 1
- 2
- 3
- 4
- 5
- 6
空间复杂度:
- 函数中创建对象的个数关于问题规模的函数表达式
- 不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数,与问题规模没有关系(简单理解就是算法执行时创建的变量个数(包括临时变量)
- 空间可以重用,算递归最坏(最深)的一种情况
二分法查找时间复杂度以及空间复杂度的算法:
先看二分法查找的程序:
int binary_search(int arr[], int key, int sz) { int left = 0; int right = sz - 1; int mid = 0; while (left <= right) { mid = left + (right - left) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] < key) { left = mid + 1; } else { right = mid - 1; } } if (left <= right) return mid;O else return 0; }
斐波那契数列
//递归法 int fib(int n) { if(n<3) return 1; else return fib(n-1)+fib(n-2); }
空间复杂度是:O(N)
文章来源: 时间复杂度与空间复杂度