最大间隙问题(线性时间算法)

来源:互联网 发布:ubuntu安装gcc5.3 编辑:程序博客网 时间:2024/04/30 15:17

问题:

最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。

分析:

该问题最先想到可能就是排序后计算,但排序的时间复杂度最少为O(nlongn),不能满足题意的线性时间算法。所以有一个解决该问题的算法,筒排序。

该算法的思想为,将n个数的最大值、最小值找到,在[ min ,max ]区间内,分成n-1个等大的区间,每个区间的大小为 

len = (max - min)/(n-1),然后将n个数字填入到这n-1个区间中,并根据填入的数,找到该区间内数字的最大值与最小值。除去两边的最大值和最小值,只需要将n-2 个数字填入到 n-1个区间中,根据抽屉原理,那至少有一个空的区间,所以,最大间隙一定产生在两个不同区间之间。

代码如下:

#include <stdio.h>#define INF 1<<30struct node{double left,right;double max=-INF,min=INF;int index=0; }x[105];int main(){int i,j;int n;double ans[105],max=-INF,min=INF; scanf("%d",&n);for(i=0;i<n;i++){scanf("%lf",ans+i);if(max<ans[i])max=ans[i];if(min>ans[i])min=ans[i];}double len = (max-min)/(n-1);x[0].left=min;x[0].right=min+len;for(i=1;i<n-1;i++){x[i].left = x[i-1].right;x[i].right = x[i].left + len;}for(i=0;i<n;i++){int temp = (ans[i]-min)/len;if(temp>=n-1)temp=n-2; x[temp].index++;if(ans[i] > x[temp].max)x[temp].max=ans[i];if(ans[i] < x[temp].min)x[temp].min = ans[i];}double Max = -INF;for(i=1;i<n-1;i++){if(x[i].min==INF)x[i].min = x[i-1].max;if(Max<x[i].min - x[i-1].max)Max = x[i].min - x[i-1].max;if(x[i].max==-INF)x[i].max=x[i].min;}printf("%lf\n",Max);return 0;} 


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机下载不了软件了怎么办 苹果手机浏览器下载不了软件怎么办 小狗吃了硬的棉花怎么办 小狗吃了隔尿垫里的棉花怎么办 眼睫毛掉进眼睛里怎么办 爱掉头发怎么办吃什么 头皮屑多头发干燥脱发怎么办 剪了头发后悔了怎么办 2岁宝宝发际线高怎么办 脱发怎么办吃什么能长发 后面头发睡平了怎么办 鸟羽毛长得不好怎么办 吃激素药头发掉怎么办 吃了药头发掉怎么办 头皮痒头发掉的厉害怎么办 西昌学院被记过了怎么办? 初三了数学太差怎么办 板绘线条不流畅怎么办 嘴被风吹歪了怎么办 被风吹的嘴歪了怎么办 怀孕一个多月见红了怎么办 b本扣了6分怎么办 b牌驾驶证扣6分怎么办 忘记了谁考证的密码怎么办 专升本学校有课怎么办 跨境额度超了怎么办 微商代购被骗了怎么办 减肥到了瓶颈期该怎么办 大润发超市把一件商品打两件怎么办 小红书上买到假货怎么办 主动退市股票钱怎么办 老板卷款逃跑财务怎么办 房开延迟交房怎么办 房开逾期交房怎么办 买了保险想退保怎么办 辐射避难所探索废土死了怎么办 大门上边的齿轮滑丝怎么办 国通石油储油卡怎么办 买大棚房受骗了怎么办 朋友做安利天天来我门面怎么办 安利优惠顾客卡怎么办