平时用的少,经常忘记,这里记录下时间复杂度的概念
复杂度是算法的一种标记方法。用O表示,通常读为big O
O的包含了时间复杂和空间复杂度
这里就只说时间复杂度。
时间复杂度的概念,个人总结,可能不太准确。
时间复杂度,即标记一个问题,随着问题规模的变化,所需要花费时间的关系。时间复杂度就是问题规模和解决问题时间的关系。
这里有两个要素:1,问题规模,2,时间t
问题规模n为变量。随着n的增大,解决时间的变化。
根据自己的理解,时间复杂度和问题规模就是一个数学问题,我画了个几个图
上图是线性关系的图,在代码层理解的话,假设解决问题规模和解决问题的时间是线性关系就如上图。时间复杂度可表示为O(n)
如遍历数组一次,数组的长度为n,n为问题规模,遍历完数组的时间即为O,假设遍历数组长度为1的数组所需要的时间是1,那么n=1,O=1,n=2,O=2……n=n,O=n
那么他们时间复杂度表示就为O(n)
指数型的时间复杂度,如最近在LeetCode中刷题所刷到的题,两数之和的代码如下
class Solution {
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
其中的问题规模n=nums.length,遍历两次,且是内部遍历。
n和O的关系是O=n²
时间复杂度为O(n²)
空间复杂度,O(1)
空间复杂度,在程序中就是解决问题所占增量的n存变化。
上诉代码中内存占用并不会随着n的变化而变化。故而为O(1)