3-Sum问题
ThreeSum程序,统计一个文件或者数组里面所有和为0的三整数元组的数量(假设整数不会溢出)。
暴力解法
一个计时程序
此程序用来在进行算法分析时,计算一段程序的运行时间,单位为秒。
package com.li.algorithm.analyse;
/*算法分析时,计算一段程序的运行时间,单位为秒*/
public class StopWatch {
private long start;
public StopWatch() {
start=System.currentTimeMillis();
}
public double elapsedTime() {
long now=System.currentTimeMillis();
return (now-start)/1000.0;
}
}
暴力程序
3—Sum的暴力解法:直接使用三重循环。
package com.li.algorithm.analyse;
import java.util.Arrays;
import com.li.base.BinarySearch;
import com.li.stdlib.In;
public class ThreeSum {
// 为数组赋值(使用随机数),有正有负
public static void assign(int[] a) {
for (int i = 0; i < a.length; i++) {
a[i] = (int) (Math.random() * 100 - 50);
}
}
// 统计和为0的三整数元组的数目
public static long count(int[] a) {
int N = a.length;
long cnt = 0L;
for (int i = 0; i < N; i++)
for (int j = i + 1; j < N; j++)
for (int k = j + 1; k < N; k++)
if (a[i] + a[j] + a[k] == 0) {
cnt++;
}
return cnt;
}
public static void main(String[] args) {
int[] a = new int[6000];
assign(a);
StopWatch time1 = new StopWatch();
System.out.println("总和:" + count(a));
System.out.println("Time:"+time1.elapsedTime()+"秒");
}
}
运行结果:
总和:276631193
Time:23.073秒
经过多次运行测试,对于6000规模的数据,运行时间总在20秒以上。
算法分析
ThreeSum(在N个数中找出三个和为零的整数元组的数量)的运行时间的增长数量级为 N3 N 3 。
3-sum的成本模型:在研究解决3-sum问题的算法时,我们记录的是数组的访问次数(访问数组的次数,无论读写)
命题:3-sum的暴力算法使用了约 N3