在O(n)

时间:2016-02-29 19:18:32

标签: arrays algorithm time-complexity

给定一个索引为1 ... n的数组和对应的值x 1 ... x n ,并且值按递增顺序排序,左 f(i)是| x i - x f(i)< / SUB> | &GT; 5.例如给定(x 1 ,x 2 ,x 3 ,x 4 )=(6, 7,12,14)然后f(4)= 2因为距离大于5的最大值(从右到左)的索引是7(因为14-12只是2的距离), f(3)= 1且f(2),f(1)未定义(无循环/模数,因为索引f(i)必须小于i)。

我正在寻找一种算法,该算法在时间复杂度O(n)中共同找到f(n),f(n-1),...,f(1)。 天真的版本只有O(n 2 )。

1 个答案:

答案 0 :(得分:0)

导致O(n)时间算法的观察结果是对于i <0。在定义f(i)和f(j)的情况下,f(i)&lt; = f(j),即f是(非严格地)增加函数。因此,当对于索引i我们找到f(i)时,f(i-1)必须等于或小于f(i)。 这是一段代码,用于捕捉算法的本质。

for (int i = 1; i <= n; i++)
  f[i] = -1; //initialize to undefined 
int j = n-1;
int i = n;
while (i > 0 && j > 0) {
  while ((j > 0) && (x[i] - x[j] <= 5))
    j--;
  if (x[i] - x[j] > 5)
    f[i] = j;
  i--;
}