题目
编写一个程序,计算输入文件中相等的整数对的数量.如果你的第一个程序是平方级别的,请继续思考并以Array.sort()给出一个线性对数级别的解答
分析
刚开始想用binarySearch,结果不行
排序以后a[i]=a[i+1],然后i++,直到a[i]!=a[i+1]
注意前置条件i不超过length
java代码
import edu.princeton.cs.algs4.Counter;
import edu.princeton.cs.algs4.StdRandom;
import java.util.Arrays;
/**
* @description: ${description}
* @create: 2019-02-23
**/
public class TwoIntEqual {
public static int countEqual1(int[] a){
int length = a.length;
int count=0;
for(int i=0;i<length;i++){//频率n
for(int j=i+1;j<length;j++){//频率(n-1)/2
if(a[i]==a[j]){
count++;
}
}
}
return count;
}
public static int countEqual2(int[] a){
int length = a.length;
Arrays.sort(a);//频率n*logn
int count=0;
for(int i=0;i<length-1;i++){//频率n
int j=i;
while(j<length-1 && a[j]==a[j+1] ){//&&两边的顺序不能对调,如果对调的话就会报错 数组下表越界,频率常数
count++;
j++;
}
}
return count;
}
public static void main(String[] args) {
int N=100000;
int max=100000;
int[] a=new int[N];
for(int i=0;i<N;i++){
a[i]= StdRandom.uniform(-max,max);
}
long past1 = System.currentTimeMillis();
System.out.println(countEqual1(a));
long past2 = System.currentTimeMillis();
System.out.println(countEqual2(a));
long past3 = System.currentTimeMillis();
System.out.println("复杂度~N平方...暴力方法耗时为:"+(past2-past1));
System.out.println("复杂度~NLogN...改进方法耗时为:"+(past3-past2));
}
}
结果
心得
(1)while(j<length-1 && a[j]==a[j+1] ){//&&两边的顺序不能对调,如果对调的话就会报错 数组下表越界,频率常数
(2)简单的算法