随着使用计算机的经验的增长,人们在使用计算机编写程序的时候,不可避免的会发出这样的疑问:
我的程序运行一次需要多久?
我的代码是否可以再优化得更快更节省空间?
当我们打开一个网页或者传输一个文件或打开一个播放器时,你也肯定问过自己上面的问题。但是在这种情况下估计时间和数据处理的复杂度太难太模糊了。相比较这种大型应用,我们能够处理的是单个程序的复杂度和效率。如果每片程序的效率都是相对较优的,那么我们也不用需要担心最后组合的应用会过于臃肿缓慢。这篇文章会对程序的算法时空复杂度,优化方法和等等一切琐事做解释,从3-sum和2-sum这两个例子开始,从头到尾演示算法是怎么对我们的程序起作用的。
例子:3-sum与2-sum计算
3-sum
一个文件中有许多不重复整数,任意三个整数可组成一组,统计其中任意三个整数和为0的组数。2-sum
一个文件中有许多不重复整数,统计其中和为0的整数对个数。
暴力算法(常规未优化算法):
public int threeSum(int[] arr) {
int count = 0;
int n = arr.length;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
for (int k = j + 1; k < n; k++)
if (arr[i] + arr[j] + arr[k] == 0)
count++;
return count;
}
public int twoSum(int[] arr) {
int count = 0;
int n = arr.length;
for (int i = 0; i < n; i++)
for (int j = i + 1; j < n; j++)
if (arr[i] == -arr[j])
count++;
return count;
}
成本模型
我们如果想要优化这段程序,首先