经典算法(3)——最大间隙问题(线性时间算法)

本文介绍了如何在线性时间内解决最大间隙问题,详细阐述了算法思想,并提供了相应的代码实现,最后展示了运行结果。
摘要由CSDN通过智能技术生成
本博客( http://blog.csdn.net/livelylittlefish )贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!
                              
                              

 最大间隙问题

                              
                              
问题描述:
                              
                              
        给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值,要求设计线性的时间算法
                              
                              

算法思想:

                              
                            
咋看这个题目,最先想到的方法就是先对n个数据进行排序,然后一边扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法:
                                                  
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[n];  //实际分到每个桶的数据个数
            double *low=new double[n]; //实际分到每个桶的最小数据
            double *high=new double[n]; //实际分到每个桶的最大数据
                            
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
输出:maxgap(最大间隙)
                              
/************************************************************************
 * 最大间隙问题:给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间
 *   的最大差值,要求设计线性的时间算法
 ***********************************************************************
*/


#include
< iostream >
#define  FILENAMELENGTH 50

// 声明函数
template < class  T >
int  indexofmin( int  n,T  * x);

template
< class  T >
int  indexofmax( int  n,T  * x);

//
class  CMaxGap
{
public:

    
int m_nCount;        //数据的个数
    double m_dblMaxGap;    //最大间隙
    double *m_dblNumber;//存放数据的数组

    CMaxGap(
const char *filename);
    
~CMaxGap();

    
double GetMaxGap(int n,double *x);
    
void Display();
}
;

// 读入数据
CMaxGap::CMaxGap( const   char   * filename)
{
    FILE 
*fp=fopen(filename,"r");
    
if
  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值