最大间隙问题

来源:互联网 发布:华硕驱动软件下载 编辑:程序博客网 时间:2024/05/10 06:38

 给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法

Java代码实现:

package 算法设计与分析;
import java.math.BigDecimal;
import java.util.Scanner;
public class maxpage {


public static void main(String[] args)
{
Scanner in1=new Scanner(System.in);
int n=in1.nextInt();
double[] a=new double[n];
for(int i=0;i<n;i++)
{
a[i]=in1.nextDouble();
}
double space=maxspace(n,a);
System.out.println(space);
in1.close();
}
public static int minx(int n,double[] a) //找出数组中最小数的下标
{
int t=0;
for(int i=0;i<n;i++)
{
if(a[i]<a[t])
{
t=i;
}
}
return t;
}
public static int maxx(int n,double[] a) //找出数组中最大数的下标
{
int t=0;
for(int i=0;i<n;i++)
{
if(a[i]>a[t])
{
t=i;
}
}
return t;
}
public static double maxspace(int n,double[] a)
{
double min=a[minx(n,a)];
double max=a[maxx(n,a)];
double length=(max-min)/(n-1);  //最大数与最小数之间有n-2等分点,划分成n-1个区域
double[] count=new double[n];
double[] low=new double[n];
double[] high=new double[n];
for(int i=0;i<n;i++)  //初始化每个区域,count数组记录每个区域的数值的个数
{
count[i]=0;
low[i]=max;
high[i]=min;
}
for(int i=0;i<n;i++)
{
int index=(int)((a[i]-min)/length)+1;//j-1区域的上界放在j区域作为下界
if(index==n)  //将最大值放入第n-1区域
{
index--;
}
count[index]++;
if(a[i]<low[index])
{
low[index]=a[i];
}
if(a[i]>high[index])
{
high[index]=a[i];
}
}
double space=0;double h=high[1];
for(int i=2;i<=n-1;i++) //鸽舍原理,n-2个值放入n-1个区域,至少一个区域为空
{                       //最大间隙不会产生在同区域的两点间
if(count[i]!=0) 
{
if(low[i]-h>space)  
{                  //java中浮点数运算有误差,二进制不能精确表示0.1
              //用BigDecimal计算
BigDecimal d1=new BigDecimal(Double.toString(low[i]));
BigDecimal d2=new BigDecimal(Double.toString(h));
space=(d1.subtract(d2)).doubleValue();
}
h=high[i];
}
}
return space;
}



}

0 0