鸽巢原理的应用

来源:互联网 发布:prcc和prcs6区别知乎 编辑:程序博客网 时间:2024/05/17 08:45
假设最大和最小数分别为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; } 

原创粉丝点击