线性时间实现最大间隙问题
2016-09-05 20:48
267 查看
最大间隙问题
问题描述:给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法
;
算法思想:
1. 找到n个数据中最大和最小数据maxx和minx;
2. 用n-2个点等分区间[minx,maxx],即将[minx,maxx]等分为n-1个区间(前闭后开区间),将这些区间看做桶,编号为1,2,...,n-2,n-1,且桶i的上界和桶i+1的下届相同,即每个桶的大小相同;
每个桶的大小为: dblAvrGap=(maxx-minx)/(n-1)
实际上,这些桶的边界就构成了一个等差数列(首项为minx,公差d=dblAvrGap),且人为将minx放入第1个桶,将maxx放入第n-1个桶。
编程实现中,用以下数据结果存放有关桶的数据:
int *count=new int
; //实际分到每个桶的数据个数
double *low=new double
; //实际分到每个桶的最小数据
double *high=new double
; //实际分到每个桶的最大数据
3. 将n个数放入n-1个桶中:
3.1 按如下规则将x[i]分配到某个桶(编号index)中: index=int((x[i]-minx)/dblAvrGap)+1;
若x[i]=minx,则被分到第1个桶中(minx即为桶1的下界);
若x[i]=桶j的下界(也是桶j-1的上界),则被分到桶j中(j>=1);
若x[i]=maxx,则被分到桶n中(max为桶n的下界桶n-1的上界),但没有桶n,解决办法:
可人为将其移入桶n-1中或者再加一个桶,这并不影响求其最大间隙;
3.2 调整分到该桶的最大最小数据;
4. 求最大间隙:
除最大最小数据maxx和minx以外的n-2个数据被放入n-1个桶中,由抽屉原理可知至少有一个桶是空的;
又因每个桶的大小相同,所以最大间隙不会在同一桶中出现;
一定是某个桶的上界(dblHigh)和其后某个桶的下界(dblLow)之间隙,且该两桶之间的桶(即编号在该两桶编号之间的桶)一定是空桶;
即最大间隙在桶i的上界和桶j的下界之间产生(j>=i+1);
问题描述:给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法
;
算法思想:
1. 找到n个数据中最大和最小数据maxx和minx;
2. 用n-2个点等分区间[minx,maxx],即将[minx,maxx]等分为n-1个区间(前闭后开区间),将这些区间看做桶,编号为1,2,...,n-2,n-1,且桶i的上界和桶i+1的下届相同,即每个桶的大小相同;
每个桶的大小为: dblAvrGap=(maxx-minx)/(n-1)
实际上,这些桶的边界就构成了一个等差数列(首项为minx,公差d=dblAvrGap),且人为将minx放入第1个桶,将maxx放入第n-1个桶。
编程实现中,用以下数据结果存放有关桶的数据:
int *count=new int
; //实际分到每个桶的数据个数
double *low=new double
; //实际分到每个桶的最小数据
double *high=new double
; //实际分到每个桶的最大数据
3. 将n个数放入n-1个桶中:
3.1 按如下规则将x[i]分配到某个桶(编号index)中: index=int((x[i]-minx)/dblAvrGap)+1;
若x[i]=minx,则被分到第1个桶中(minx即为桶1的下界);
若x[i]=桶j的下界(也是桶j-1的上界),则被分到桶j中(j>=1);
若x[i]=maxx,则被分到桶n中(max为桶n的下界桶n-1的上界),但没有桶n,解决办法:
可人为将其移入桶n-1中或者再加一个桶,这并不影响求其最大间隙;
3.2 调整分到该桶的最大最小数据;
4. 求最大间隙:
除最大最小数据maxx和minx以外的n-2个数据被放入n-1个桶中,由抽屉原理可知至少有一个桶是空的;
又因每个桶的大小相同,所以最大间隙不会在同一桶中出现;
一定是某个桶的上界(dblHigh)和其后某个桶的下界(dblLow)之间隙,且该两桶之间的桶(即编号在该两桶编号之间的桶)一定是空桶;
即最大间隙在桶i的上界和桶j的下界之间产生(j>=i+1);
#include<stdio.h> #include<string.h> #include<math.h> #include<iostream> #include<algorithm> #include<queue> #include<stack> using namespace std; int len1,len2,n; double s[100],l[105],h[105]; int cnt[105]; int Min,Max; double gap() { int i; Min=Max=0; double tmp1,tmp2; tmp1=tmp2=s[1]; //确定最大最小界限 for (i=2;i<=n;i++) { if (s[i]>tmp1) { tmp1=s[i]; Max=i; } if (s[i]<tmp2) { tmp2=s[i]; Min=i; } } for (i=1;i<=n;i++) //初始化处理 { h[i]=s[Min]; l[i]=s[Max]; } for (i=1;i<=n;i++) //划分区间,n个元素分成n-1份,保证有个空区间 { int bucket=int((n-1)*(s[i]-s[Min])/(s[Max]-s[Min]))+1; //确定第i个元素在哪个区间 if (s[i]<l[bucket]) l[bucket]=s[i]; if (s[i]>h[bucket]) h[bucket]=s[i]; } double left,gap,ans=0; left=h[1]; //寻找最大间距,对本区间的上界与下个区间的下界进行依次比较 for (i=2;i<=n;i++) //关键思想是要知道怎么确定最大区间 if (cnt[i]) { gap=l[i]-left; if (gap>ans) ans=gap; left=h[i]; } return ans; } int main() { int i,j; while (~scanf("%d",&n)) { for (i=1;i<=n;i++) scanf("%lf",&s[i]); printf("%.2lf\n",gap()); } return 0; }
相关文章推荐
- 鸽舍原理 线性时间计算最大间隙问题
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 最大间隙问题 线性时间算法
- 线性时间算法解决最大间隙问题
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 最大间隙问题(线性时间)
- 经典算法(3)——最大间隙问题(线性时间算法)
- 最大间隙问题(线性时间算法)
- 最大间隙问题(线性时间算法)
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 线性时间解决最大子数组问题
- 求解最大子序列和问题的线性时间算法
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 石油主管道最优位置问题(平均时间为线性时间)C++实现
- C语言实现最大间隙问题实例
- 最大子数组之和(线性时间复杂度,C语言实现)
- 流水线调度最优问题(装配线调度问题)动态规划 O(n)时间(线性时间)C++实现
- 算法导论4.1-3~4.1-5最大子数组暴力算法和递归算法的实现和线性时间算法实现