1. 程式人生 > >Algs4-1.4.38 3-sum的初級算法與ThreeSum性能比較

Algs4-1.4.38 3-sum的初級算法與ThreeSum性能比較

ring font pub photo == aps gtest bsp data-

1.4.38 3-sum的初級算法的實現。通過實驗評估以下ThreeSum內循環的實現性能:
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
if(i<j && j<k)
if(a[i]+a[j]+a[k]==0)
cnt++;
為此實現另一個版本的DoublingTest,計算該程序和ThreeSum的運行時間的比例。
答:
技術分享圖片
public class E1d4d38
{
public static int countOfThreeSum(int[] a)
{
int N=a.length;
int cnt=0;
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;
}//end countOfThreeSum

public static int countOfBasicThreeSum(int[] a)
{
int N=a.length;
int cnt=0;
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
for(int k=0;k<N;k++)
if(i<j && j<k)
if(a[i]+a[j]+a[k]==0)
cnt++;
return cnt;
}//end countOfBasicThreeSum


public static void timeTrial(int N)
{
int MAX=1000000;
int[] a=new int[N];
for(int i=0;i<N;i++)
a[i]=StdRandom.uniform(-MAX,MAX);

//
Stopwatch timerBasicThreeSum=new Stopwatch();
int cntBasicThreeSum=countOfBasicThreeSum(a);
double timeBasicThreeSum= timerBasicThreeSum.elapsedTime();
//
Stopwatch timerThreeSum=new Stopwatch();
int cntThreeSum=countOfThreeSum(a);
double timeThreeSum= timerThreeSum.elapsedTime();
//
StdOut.printf("N=%7d BasicTime=%7.1f ThreeSumTime=%7.1f Rate=%7.1f \n",N,timeBasicThreeSum,timeThreeSum,timeBasicThreeSum/timeThreeSum);
}

public static void main(String[] args)
{
for (int N=250;N<Integer.MAX_VALUE/2;N+=N)
{
timeTrial(N);
}
}//end main
}

Algs4-1.4.38 3-sum的初級算法與ThreeSum性能比較