C语言实现最大间隙问题实例
本文实例展示了C语言实现最大间隙问题的方法,对于算法的设计有一定的借鉴价值。分享给大家供大家参考。具体如下:
问题描述如下:
给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法。
解决思路:
注意题中要求设计线性时间算法。如果没有这个要求,就可以先排序,找出来就很方便。但我们知道排序最优良的算法的时间效率也是nlogn的。所以不可行。
采用一种区间算法。具体步骤就不说了,给出C语言代码,有注释加以说明。
具体实现代码如下:
#include "stdio.h" #include "stdlib.h" #define MAX 10000 float findmin(float data[],int n){/*寻找数据序列中的最小值*/ int index,i; float min,temp; temp=data[0]; for(i=1;i<n;i++){ if(data[i]<temp){ temp=data[i]; index=i; } } min=data[index]; return min; } float findmax(float data[],int n){/*寻找数据序列中的最大值*/ int index,i; float max,temp; temp=data[0]; for(i=1;i<n;i++){ if(data[i]>temp){ temp=data[i]; index=i; } } max=data[index]; return max; } void initial(int n,int count[],float low[],float high[],float min,float max){/*初始化区间*/ int i; for(i=0;i<n;i++){ count[i]=0; //区间是否有数据存入 low[i]=max; //将区间的左端赋值最大值 high[i]=min; //将区间的右端复制最小值 } } void dataIn(float m,int count[],float low[],float high[],int n,float data[],float min){/*将数据序列依次放入对应区间*/ int i,location; for(i=0;i<n;i++){ location=int((data[i]-min)/m)+1; //判断数据进入哪个区间:按照等分区间,数据与最小值的差与区间大小的比值+1就是区间编号 if(location==n) location--; count[location]++; //有数据存入,计数值加1 if(data[i]<low[location]) //如果数据比左端值小,则作为左端值 low[location]=data[i]; if(data[i]>high[location]) //如果数据比右端值大,则作为右端值 high[location]=data[i]; } } float findMaxGap(int n,float low[],float high[],int count[]){ /*找出最大间隙,整个问题的核心*/ /*函数说明*/ /*上面已经把对应数据放入相应的区间,在之前可以知道,总共有n-1区间,相应的只有n-2个值,那么就一定有一个区间不会有数据*/ /*因为最大值与最小值已经分别被设为最小区间的左端值和最大区间的右端值,所以中间的n-1区间只有n-2个值*/ /*那么可以想象,最大间隙肯定不会是在一个区间中,而一定是在空区间的两端, 最大间隙为空区间右边相邻区间的左端值空区间左边相邻区间的右端值;有可能有多个这种情况,找出最大就行了*/ int i; float maxgap,dhigh,temp; dhigh=high[1]; for(i=2;i<n;i++){ if(count[i]){ temp=low[i]-dhigh; if(maxgap<temp) maxgap=temp; dhigh=high[i]; } } return maxgap; } int main(){ float data[MAX]; int n,i=0; float min,max; float m,maxgap; float low[MAX],high[MAX]; int count[MAX]; scanf("%d",&n); for(i=0;i<n;i++) scanf("%f",&data[i]); min=findmin(data,n); max=findmax(data,n); m=(max-min)/(n-1); initial(n,count,low,high,min,max); dataIn(m,count,low,high,n,data,min); maxgap=findMaxGap(n,low,high,count); printf("%.1f",maxgap); system("pause"); return 0; }
感兴趣的朋友可以测试运行本文实例以加深理解。相信本文所述对大家C程序算法设计的学习有一定的借鉴价值。
栏 目:C语言
下一篇:C语言实现输入一个字符串后打印出该字符串中字符的所有排列
本文标题:C语言实现最大间隙问题实例
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3365.html
您可能感兴趣的文章
- 04-02c语言函数调用后清空内存 c语言调用函数删除字符
- 04-02c语言的正则匹配函数 c语言正则表达式函数库
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言中对数函数的表达式 c语言中对数怎么表达
- 04-02c语言用函数写分段 用c语言表示分段函数
- 04-02c语言编写函数冒泡排序 c语言冒泡排序法函数
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段函数
- 04-02C语言中怎么打出三角函数 c语言中怎么打出三角函数的值
- 04-02c语言调用函数求fibo C语言调用函数求阶乘
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 01-10SublimeText编译C开发环境设置
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 04-02jquery与jsp,用jquery
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10C#中split用法实例总结
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10delphi制作wav文件的方法