给定n个实数x1,x2,x3...xn,求这n个数在实数轴上相邻2个数之间的最大差值,设计最大间隙问题的线性时间算法。利用抽屉原理(或称为鸽舍原理--即有4个苹果放进5个抽屉里面,肯定至少有一个抽屉没有苹果),算法如下:double maxgap(int n,double x[]) { double minx=x[mini(n,x)] , maxx = x[maxi(n,x)]; int *count = new int[n+1]; double *low = new double[n+1]; double *high = new double[n+1]; // 初始化桶 int i; for(i=1;i<=n-1;i++){ count[i]=0; low[i]=maxx; high[i]=minx; } // 将n个数置于n-1个桶中 for(i=1;i<=n;i++){ int bucket = int((n-1)*(x[i]-minx)/(maxx-minx))+1; count[bucket]++; if(x[i]<low[bucket]) low[bucket] = x[i]; if(x[i]>high[bucket])high[bucket]= x[i]; } // 此时,除了maxx和minx外的n-2个数被置于n-1个桶中 // 由抽屉原理可知,至少有一个桶是空的 // 这意味着最大间隙不会出现在同一个桶中的两个数之间 // 对每一个桶做一次线性扫描可找出最大间隙 ... }