最大间隙问题
问题描述:
最大间隙问题:给定n 个实数x1 , x2 , , xn ,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对
任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。
编程任务:
对于给定的n 个实数 x1 , x2, ……, xn,编程计算它们的最大间隙。
数据样例:
输入数据:
5
2.3 3.1 7.5 1.5 6.3
输出数据:
3.2

View Code
1 #ifndef 最大间隙_H 2 #define 最大间隙_H 3 4 int minIndex(double* x ,int n); 5 int maxIndex(double* x,int n); 6 7 double maxGap(double* x,int n) 8 { 9 double minx = x[minIndex(x,n)];//最大的数 10 double maxx = x[maxIndex(x,n)];//最小的数 11 /* 12 用n-2个等兼具点分割区间[minx,maxx],产生n-1个桶,每个i中用high[i]和low[i] 13 分别存储分配给桶i的书中的最大值最小值 14 */ 15 int* count = new int[n]; 16 double* low = new double[n]; 17 double* high = new double[n]; 18 //桶的初始化 19 for(int i = 0;i<n;i++) 20 { 21 count[i] = 0; 22 low[i] = maxx; 23 high[i] = minx; 24 } 25 //分配每个数到各个桶中 26 for(int i=0;i<n;i++) 27 { 28 int bucket = int((n-1)*(x[i]-minx)/(maxx-minx)) ; 29 count[bucket]++; 30 if(x[i]<low[bucket]) 31 low[bucket] = x[i]; 32 if(x[i]>high[bucket]) 33 high[bucket] = x[i]; 34 } 35 double temp = 0,left = high[0]; 36 //最大间隙显然不出现在同一个桶中的两个数,二十出现在相邻两个桶中,而且由于鸽巢原理,必定至少有一个桶是空的,也就是要找到这个桶,然后该桶前一个桶的最大值和该桶 37 //后一个的最小值的差即为最大间隙,当然如果有多个空桶,只要比较选出期中最大的即可 38 for(int i=1;i<n;i++) 39 { 40 if(count[i]) 41 { 42 double thisgap = low[i] - left; 43 if(thisgap > temp) 44 temp = thisgap; 45 left = high[i]; 46 } 47 } 48 delete[] count; 49 delete[] low; 50 delete[] high; 51 return temp; 52 } 53 int minIndex(double* x ,int n) 54 { 55 int index = 0; 56 for(int i = 0;i<n;i++) 57 { 58 if(x[i]<x[index]) 59 index = i; 60 } 61 return index; 62 } 63 int maxIndex(double* x,int n) 64 { 65 int index = 0; 66 for(int i = 0;i<n;i++) 67 { 68 if(x[i]>x[index]) 69 index = i; 70 } 71 return index; 72 } 73 #endif


浙公网安备 33010602011771号