为什么世界要那么复杂呢???1-5最大间隙问题

2 篇文章 0 订阅
2 篇文章 0 订阅

1-5最大间隙问题

问题描述:

最大间隙问题:给定n 个实数x1 , x2 , , xn ,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对

任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。

编程任务:

对于给定的n 个实数 x1 , x2, ……, xn,编程计算它们的最大间隙。

数据样例:

输入数据:

5

2.3 3.1 7.5 1.56.3

输出数据:

3.2

解题思路:

1,比较直接的方法是先对n个数进行排序,最快时间为nlogn,然后遍历数据顺便计算每两个数据之间的间隔

该方法不是线性时间

2,想要用线性时间解决该问题可以使用组合数学中学到的鸽巢原理,将n个数放入n-1个桶中,每个桶大小相同为(max-min)/(n-1)且有一个上界和一个下界,第i个桶的上界为第i+1个桶的下界;

由于除去最小数字和最大数字还剩下n-2个数字,因此至少有一个桶是空的,因为最小数字一定是第1个桶的下界,最大数字一定是第n-1个桶的上界;

初始状态每个桶的上下界分别为[max,min],遍历所有数字(O(n)时间),将每个数字放入到第对应的桶中,并更新桶的上下界,例如有一个4-6的桶初始界为[8,2],只有5落入该桶,则桶的上下界更新为[5,5],并设置计数器count记录每个桶中的数字个数;

然后,一次线性扫描即可得到最大间隙。

(我承认没有用桶排序,但是这样子很是方便,复杂度方面也只是nlgn,还好吧,桶排序回头再学一学)

# include <stdio.h>

# include <stdlib.h>


int comp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}


void main()
{
float a[1000],b[1000];
int i,n;
scanf("%d",&n);


for(i=0;i<n;i++)
{
scanf("%f",&a[i]);
}


qsort(a,n,sizeof(float),comp);


for(i=0;i<n-1;i++)
{
  b[i]=a[i+1]-a[i];
}

     
qsort(b,n-1,sizeof(float),comp);


printf("%f",b[n-2]);


}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值