鸽舍原理 线性时间计算最大间隙问题

来源:互联网 发布:linux mv 不覆盖 编辑:程序博客网 时间:2024/04/27 20:50

首先明白鸽舍原理的内容:

1.将n+1个元素划分为n类,则至少有一类含有2个或2个以上

2。把多于M*N个物体放到N个抽屉中,则至少有一个抽屉含有M+1或以上个元素。

计算最大间隙问题:

显然元素已知,则我们要定义这个抽屉,元素为n,所以我们以首尾两个元素为边界,剩下n-2个元素,所以抽屉应该为n-1,这样可以保证至少有一个抽屉是空的,由于采用等分,所以这个最大的间隙就是遍历一遍,将这个有元素的抽屉中的元素减去前一个抽屉中最小的元素就是这个最大的间隙。

代码如下:

#include<stdio.h>


int minii(int n,double *x)
{
    double tmp=x[0];
    int index,i;
    for(i=1;i<n;i++)
        if(x[i]<tmp)
        {
            tmp=x[i];
            index=i;
        }
    return index;
}


int maxii(int n,double *x)
{
    double tmp=x[0];
    int index,i;
    for(i=1;i<n;i++)
        if(x[i]>tmp)
        {
            tmp=x[i];
            index=i;
        }
    return index;
}


double maxGap(int n,double x[])
{
    double mini=x[minii(n,x)];
    double maxi=x[maxii(n,x)];


    int counts[20];
    double low[20];
    double high[20];
    int i;
    for(i=0;i<n;i++)
    {
        counts[i]=0;
        low[i]=maxi;
        high[i]=mini;
    }


    for(i=0;i<n;i++)
    {
        int bucket=int((n-1)*(x[i]-mini)/(maxi-mini))+1;
        counts[bucket]++;
        if(x[i]<low[bucket])
            low[bucket]=x[i];
        if(x[i]>high[bucket])
            high[bucket]=x[i];
    }


    double tmp=0,left=low[0];
    for(i=1;i<n;i++)
    {
        if(counts[i])
        {
            double thisGap=high[i]-left;
            if(thisGap>tmp)
                tmp=thisGap;
            left=low[i];
        }
    }
    return tmp;
}


int main()
{
    double x[5]={2.3,3.1,7.5,1.5,6.3};
    int n=5;
    printf("%lf\n",maxGap(n,x));
}

0 0
原创粉丝点击