C语言实现最大间隙问题实例

 更新时间:2014年09月16日 15:03:27   投稿:shichen2014  
这篇文章主要介绍了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/c++中的左值右值详解

    这篇文章主要介绍了c/c++中的左值右值,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • C语言中sizeof()与strlen()函数的使用入门及对比

    C语言中sizeof()与strlen()函数的使用入门及对比

    这篇文章主要介绍了C语言中sizeof()与strlen()函数的使用入门及对比,同时二者在C++中的使用情况也基本上同理,是需要的朋友可以参考下
    2015-12-12
  • C++简单五子棋的AI设计实现

    C++简单五子棋的AI设计实现

    这篇文章主要为大家详细介绍了C++简单五子棋的AI设计实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • C/C++的关键字之static你了解吗

    C/C++的关键字之static你了解吗

    这篇文章主要为大家详细介绍了C/C++的关键字之static,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • c++ qt自定义搜索编辑框的实现方法

    c++ qt自定义搜索编辑框的实现方法

    这篇文章主要介绍了c++ qt自定义搜索编辑框,通过自定义QLineEdit,在编辑框里添加布局,将按钮设置在右边,当点击按钮搜索按钮时发送信号到主界面做相应的操作,需要的朋友可以参考下
    2022-03-03
  • C++事件处理中的__hook与__unhook用法详解

    C++事件处理中的__hook与__unhook用法详解

    这篇文章主要介绍了C++事件处理中__hook与__unhook的用法,C++中的COM类主要支持事件处理,需要的朋友可以参考下
    2016-01-01
  • Java C++ 题解leetcode1619删除某些元素后数组均值

    Java C++ 题解leetcode1619删除某些元素后数组均值

    这篇文章主要为大家介绍了Java C++ 题解leetcode1619删除某些元素后数组均值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 详谈浮点精度(float、double)运算不精确的原因

    详谈浮点精度(float、double)运算不精确的原因

    这篇文章主要介绍了详谈浮点精度(float、double)运算不精确的原因,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 详解C++中StringBuilder类的实现及其性能优化

    详解C++中StringBuilder类的实现及其性能优化

    在Java和C#中,StringBuilder可以创造可变字符序列来动态地扩充字符串,那么在C++中我们同样也可以实现一个StringBuilder并且用来提升性能,下面就来详解C++中StringBuilder类的实现及其性能优化
    2016-05-05
  • qml中QtObject类型的用法小结

    qml中QtObject类型的用法小结

    QtObject 类型是一个非可视元素,仅包含objectName属性,如果需要一个非常轻量级的类型来包含一组自定义属性,那么创建一个QtObject,本文给大家介绍qml中QtObject类型的使用,感兴趣的朋友一起看看吧
    2024-01-01

最新评论