鸽巢原理的应用

假设最大和最小数分别为max和min,将n个数投入n+1个桶中,桶与桶的间距gap=(max-min)/(n+1),每个数x所在的桶的位置是x/gap,利用的鸽巢原理,至少一个桶是空的,那么两个相邻数之间的最大距离必定>=gap。实现时,用两个数组分别保留每个桶中的最大、最小值,然后按顺序遍历桶,找出每个桶中最大的值和下一个不为空的桶最小的值之间的最大的,即为最大距离。
查找最大值、最小值,将数放入桶中及找出相邻非空桶之间的最大距离,时间复杂度均为O(n),因此总时间复杂度也为O(n)。
#include<iostream> 
using namespace std; 

void print(string, float *, int); 

float data[] = {3.4, 2.1, 5.1, 1.4, 8.5, 7.4, 6.3}; 

float getMax(float data[], int size){ 
    int i; 
    float max = data[0]; 
    for (i = 1; i < size; ++i) { 
        if (data[i]>max) 
            max = data[i]; 
    } 
    return max; 
} 

float getMin(float data[], int size){ 
    int i; 
    float min = data[0]; 
    for (i = 1; i < size; ++i) { 
        if (data[i]<min) 
            min = data[i]; 
    } 
    return min; 
} 

float findMaxGap(float data[], int size){ 
    float max = getMax(data, size); 
    float min = getMin(data, size); 
    cout<<max<<" "<<min<<endl; 
    int slot = size-1; 
    float gap = (max-min)/slot; 
    float *high = new float[slot]; 
    float *low = new float[slot]; 
    for (int i = 0; i < slot; ++i) { 
        high[i] = min; 
        low[i] = max; 
    } 

    for (int j = 0; j < size; ++j) { 
        if(data[j]!=max&& data[j]!=min){ 
            int index = (data[j] - min)/gap; 
            if(high[index]<data[j]) 
                high[index]= data[j]; 
            if(low[index]>data[j]) 
                low[index]=data[j]; 
        } 
    } 

    float maxGap = 0; 
    float lowedg = min; 
    for (int var = 0; var < slot; ++var) { 
        if(high[var]!=min){  // 当桶为空时
            if(low[var]-lowedg>maxGap) 
                maxGap = low[var]-lowedg; 
            lowedg = high[var]; 
        } 
    } 

    return maxGap; 
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值