最大间隙问题:给定n 个实数x1 , x2 ,... , xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。 对于给定的n 个实数x1 , x2 ,... , xn,编程计算它们的最大间隙。
思路:
利用鸽笼原理,将n个鸽子放入n-1个笼子,必有一个笼子是空的。
首先找到这n个数中的最大值max和最小值min,将min到max之间的数等分成n-1段,将这n个数放置在相应的段中,记录每一段中最靠近左端点的值和最靠近右端点的值,最大间隙出现的位置肯定在两段之间,而不可能出现在某一段里面。
代码如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
float* data;
float* low;
float* high;
int index;
float max_gap=0,temp;
float max,min;
int i;
scanf("%d",&n);
data=(float*)malloc(sizeof(float)*n);
low=(float*)malloc(sizeof(float)*n);
high=(float*)malloc(sizeof(float)*n);
for(i=0;i<n;i++)
{
scanf("%f",&data[i]);
}
max=data[0];
min=data[0];
for(i=1;i<n;i++)
{
if(data[i]>max)
max=data[i];
if(data[i]<min)
min=data[i];
}
for(i=0;i<n;i++)
{
low[i]=max;
high[i]=min;
}
for(i=0;i<n;i++)
{
index=(data[i]-min)*(n-1)/(max-min);
if(data[i]<low[index])
low[index]=data[i];
if(data[i]>high[index])
high[index]=data[i];
}
for(i=0;i<n;i++)
{
if(low[i]<=high[i])
continue;
index=i;
while(low[i]>high[i])
i++;
temp=low[i]-high[index-1];
if(max_gap<temp)
max_gap=temp;
}
printf("%f",max_gap);
return 0;
}