最大间隙问题(线性时间)
2016-09-05 20:33
274 查看
问题描述:
最大间隙问题:给定n 个实数x1, x2 ,..., xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗O(1),设计解最大间隙问题的线性时间算法。
编程任务:
对于给定的n 个实数x1,x2,...,xn,编程计算它们的最大间隙。
数据输入:
输入数据由文件名为input.txt的文本文件提供。文件的第1 行有1 个正整数n。接下来的1 行中有n个实数 x1,x2,...,xn 。
结果输出:
程序运行结束时,将找到的最大间隙输出到文件output.txt中。
输入文件示例 输出文件示例
input.txt
5
2.3 3.1 7.5 1.5 6.3
output.txt
3.2
思路:
因为不能用排序(排序算法最小时间复杂度为O(nlogn)),可以先取这组数的最大值max和最小值min,然后将这段区间分为n-1个,区间上界为max,下界为min,这样就可以将n-2个数放到n-1个区间中,根据鸽巢原理,至少有一个区间中没有数,放完数后再从头开始扫,找出最大间隙,,,
#include<stdio.h>
#define MIN -10000000
#define MAX 10000000
double block_max[1000]; //存放每个区间的最大值
double block_min[1000]; //存放每个区间的最小值
int block_count[1000]; //记录区间中的数的个数
int n;
double max_gap=MIN;
double a[1000];
void init()
{ //初始化数组
int i;
for(i=0;i<n;i++)
{
block_max[i]=MIN;
block_min[i]=MAX;
block_count[i]=0;
}
}
int main()
{
double min,max;
int i,j,index;
double gap;
min=MAX;
max=MIN;
scanf("%d",&n);
init();
for(i=0;i<n;i++)
{ //找出这组数中的最大数和最小数
scanf("%lf",&a[i]);
if(a[i]<min)
min=a[i];
if(a[i]>max)
max=a[i];
}
//printf("%.2lf %.2lf\n\n",min,max);
gap=(max-min)/(n-1); //每个区间的初始大小
for(i=0;i<n;i++)
{
index=(int)((a[i]-min)/gap);
if(index==n-1)
index--;
if(block_max[index]<a[i]) //改变区间的上界
block_max[index]=a[i];
if(block_min[index]>a[i]) //改变区间的下界
block_min[index]=a[i];
block_count[index]++;
}
i=0;
double gap_left,gap_right;
int flag;
while(i<n-1)
{ //从头开始扫
if(block_count[i]>0)
{
gap_left=block_max[i]; //若区间中有数,记录区间的最大值
flag=i+1; //接着往后扫
while(flag<n-1)
{
if(block_count[flag]>0) //发现区间中有数,记录区间的最小值
{
gap_right=block_min[flag];
break;
}
flag++;
}
}
double re_gap=gap_right-gap_left; //计算两个数的间隙
if(re_gap>max_gap)
{
max_gap=re_gap;
}
i=flag; //从当前位置开始扫
}
printf("%.2lf\n",max_gap);
return 0;
}
最大间隙问题:给定n 个实数x1, x2 ,..., xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗O(1),设计解最大间隙问题的线性时间算法。
编程任务:
对于给定的n 个实数x1,x2,...,xn,编程计算它们的最大间隙。
数据输入:
输入数据由文件名为input.txt的文本文件提供。文件的第1 行有1 个正整数n。接下来的1 行中有n个实数 x1,x2,...,xn 。
结果输出:
程序运行结束时,将找到的最大间隙输出到文件output.txt中。
输入文件示例 输出文件示例
input.txt
5
2.3 3.1 7.5 1.5 6.3
output.txt
3.2
思路:
因为不能用排序(排序算法最小时间复杂度为O(nlogn)),可以先取这组数的最大值max和最小值min,然后将这段区间分为n-1个,区间上界为max,下界为min,这样就可以将n-2个数放到n-1个区间中,根据鸽巢原理,至少有一个区间中没有数,放完数后再从头开始扫,找出最大间隙,,,
#include<stdio.h>
#define MIN -10000000
#define MAX 10000000
double block_max[1000]; //存放每个区间的最大值
double block_min[1000]; //存放每个区间的最小值
int block_count[1000]; //记录区间中的数的个数
int n;
double max_gap=MIN;
double a[1000];
void init()
{ //初始化数组
int i;
for(i=0;i<n;i++)
{
block_max[i]=MIN;
block_min[i]=MAX;
block_count[i]=0;
}
}
int main()
{
double min,max;
int i,j,index;
double gap;
min=MAX;
max=MIN;
scanf("%d",&n);
init();
for(i=0;i<n;i++)
{ //找出这组数中的最大数和最小数
scanf("%lf",&a[i]);
if(a[i]<min)
min=a[i];
if(a[i]>max)
max=a[i];
}
//printf("%.2lf %.2lf\n\n",min,max);
gap=(max-min)/(n-1); //每个区间的初始大小
for(i=0;i<n;i++)
{
index=(int)((a[i]-min)/gap);
if(index==n-1)
index--;
if(block_max[index]<a[i]) //改变区间的上界
block_max[index]=a[i];
if(block_min[index]>a[i]) //改变区间的下界
block_min[index]=a[i];
block_count[index]++;
}
i=0;
double gap_left,gap_right;
int flag;
while(i<n-1)
{ //从头开始扫
if(block_count[i]>0)
{
gap_left=block_max[i]; //若区间中有数,记录区间的最大值
flag=i+1; //接着往后扫
while(flag<n-1)
{
if(block_count[flag]>0) //发现区间中有数,记录区间的最小值
{
gap_right=block_min[flag];
break;
}
flag++;
}
}
double re_gap=gap_right-gap_left; //计算两个数的间隙
if(re_gap>max_gap)
{
max_gap=re_gap;
}
i=flag; //从当前位置开始扫
}
printf("%.2lf\n",max_gap);
return 0;
}
相关文章推荐
- 最大间隙问题(线性时间算法)
- 最大间隙问题(线性时间算法)
- 经典算法(3)——最大间隙问题(线性时间算法)
- 大数据面试题求解:给定n个实数 ,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法(最大间隙问题)
- 最大间隙问题 线性时间算法
- 线性时间实现最大间隙问题
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 线性时间算法解决最大间隙问题
- 鸽舍原理 线性时间计算最大间隙问题
- 最大间隙问题。给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- 最大子数组问题的递归和非递归(线性时间)代码
- 求解最大子序列和问题的线性时间算法
- 最大子数组问题---线性时间算法(转)
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 线性时间解决最大子数组问题
- 线性时间求最大间隔
- 一个时间的最大访客问题
- 【开放 5月18日 发布】:子数组的最大乘积问题_____问题简单,请思考如何逐步降低时间复杂度,跟帖回复,群内讨论.
- 阿里巴巴面试算法题目:有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间