import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;
import edu.princeton.cs.algs4.Stopwatch;
public class E1_4_19 {
public static void main(String[]args){
//测试是否正确
int[][]a={{1, 2, 15, 4, 5},
{6, 7, 0, 8, 9},
{10, 11, 12, 13, 14}};
int[]index=LocalMinArray(a);
StdOut.println("index=("+index[0]+","+index[1]+")");
//Doubling Ratio test
int N=125;
double prev=timeTrial(N);
for (N=250;true;N+=N){
double now=timeTrial(N);
StdOut.printf("N=%10d time=%7.1f ratio=%6.1f\n",N,now,now/prev);
prev=now;
}
}
public static double timeTrial(int N){
int MAX=1000000;
int[][]a=new int[N][N];
for (int i=0;i<N;i++)//不能保证满足distinct条件
for (int j=0;j<N;j++)
a[i][j]= StdRandom.uniform(-MAX,MAX);
Stopwatch time=new Stopwatch();
int[]index=LocalMinArray(a);
return time.elapsedTime();
}
public static int[] LocalMinArray(int[][]a){
int left=0,right=a[0].length-1;
int top=0,bottom=a.length-1;
while (left<right&&top<bottom){
int colMid=(left+right)/2;
int rowMid=(top+bottom)/2;
if (rowMid-1<0||rowMid+1>=a.length||colMid-1<0||colMid+1>=a[0].length)
return new int[]{-1,-1};
if (a[rowMid][colMid]>a[rowMid][colMid-1]) right=colMid;
else if (a[rowMid][colMid]>a[rowMid][colMid+1]) left=colMid;
else if (a[rowMid][colMid]>a[rowMid-1][colMid]) bottom=rowMid;
else if (a[rowMid][colMid]>a[rowMid+1][colMid]) top=rowMid;
else
return new int[]{rowMid,colMid};
}
return new int[]{-1,-1};
}
}