最大间隙问题

 

 

问题描述:

最大间隙问题:给定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

 

 

 

posted @ 2012-09-25 16:49  我是杀手不冷  阅读(327)  评论(0)    收藏  举报