在给定索引处以小于数字的数组中的索引号查找最近的数字

时间:2013-04-15 16:53:57

标签: algorithm optimization complexity-theory

这是一个算法优化问题。

我有一个整数数组A,并希望构建数组B,使B[i]包含j中元素的索引A[j],使得B[i] = j {1}})

1. j > i
2. A[j] < A[i]
3. j is minimum of all possible j's.

例如A是:

   A = [1,5,6,4,3,1,2]

然后B将(从0开始索引)

   B = [-1,3,3,4,5,-1,-1]

B[0] = -1因为索引超过1的数字少于0B[1] = 3因为A[3]1A的最接近的元素,其中包含的数字小于A[1]=5。等等。

我使用二叉搜索树知道O(n*log(n))复杂度的解决方案。如何增加O(n)的复杂性或证明它是不可能的?

1 个答案:

答案 0 :(得分:4)

除非我误解了这个问题,否则你可以通过一个简单的从左到右的扫描来解决它,保留一堆尚未遇到更小元素的索引。 (由于显而易见的原因,与堆栈上的索引相对应的值必须是单调递减的。)

对于输入列表中的每个值,当该值小于堆栈顶部索引(如果有)的值时,将输出列表的对应元素设置为当前输入值的索引并弹出堆栈。

以下小Python程序说明:

def ind(a):
  b = [-1] * len(a)
  stack = []
  for i in range(len(a)):
    v = a[i]
    while stack and a[stack[-1]] > v:
      j = stack.pop()
      b[j] = i
    stack.append(i)
  return b

证明它是O(n):for循环显然执行n次。 while循环的主体(最多)执行最多n次,因为每个元素只能执行一次。或者,换句话说,每个元素最多被推送和弹出一次。