最大间隙问题

来源:互联网 发布:相机推荐知乎 编辑:程序博客网 时间:2024/04/28 22:13

 最大间隙问题:给定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;}


原创粉丝点击