时间复杂度
O(n)表示的是最差情况下的复杂度
额外空间复杂度看的是自主空间,也就是除了题目要求返回的或者题目本身的参数以外,自主解决该问题开辟的空间,比如题目里让返回一个数组,参数里也有个数组,这个时候不需要额外新开辟数组,则复杂度仍为O(1)而不是O(n)
Java中,HashMap相关操作的时间复杂度为O(1),TreeMap相关操作的时间复杂度为O(logN),二分查找的时间复杂度为O(logN)
时间复杂度尽可能低之后,额外空间复杂度尽可能优化 → 最优解
最优解不考虑常数项时间的优化
时间复杂度从小到大:
O(1) < O(logN) < O(N) < O(N*logN) < O(N^2) <= O(N^k) < O(2^N) <= O(k^N) < O(N!)
对数器
在没有在线测试(OJ)的条件下对算法进行测试 → 自己生成大样本随机数据
同样的一个功能可能有多种实现方法,暴力的时间复杂度高的方法往往容易想出来,而想出来的以为是最优解的优化方法要验证是否正确,就可以用对数器进行测试该方法。
生成大量测试数据,对两套思路同时进行测试,如果两套思路运行结果不一致,可能就会产生一些没想到的边界条件,进一步去看两个方法是否正确。
public static int[] generateRandomArray(int maxSize, int maxValue) {
// Math.random() → [0, 1)随机等概率小数
// Math.random() * N → [0, N)随机等概率小数
// (int) (Math.random() * N) → [0, N - 1]整数等概率返回
int[] arr = new int[(int)((maxSize + 1) * Math.random())]; // 长度为[0, MaxSize]的随机值
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); // 随机值 - 随机值 可能正 负 0
}
return arr;
}
copyArray方法用来copy数组元素并生成一个新的数组对象,对拷贝自arr的arr1和arr2操作结果如果结果不一样,可以打印原本arr数组的值,并调小maxSize,用来找错误的样例


412

被折叠的 条评论
为什么被折叠?



