Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 按数组中小于给定索引处数字的索引数查找最近的_Algorithm_Optimization_Complexity Theory - Fatal编程技术网

Algorithm 按数组中小于给定索引处数字的索引数查找最近的

Algorithm 按数组中小于给定索引处数字的索引数查找最近的,algorithm,optimization,complexity-theory,Algorithm,Optimization,Complexity Theory,这是一个算法优化问题 我有一个整数数组A,希望构建数组B,这样B[I]包含A[j]中元素的索引j,这样(B[I]=j) 然后B将是(从0开始索引) B[0]=-1,因为没有小于1且索引大于0的数字。 B[1]=3,因为A[3]是A中距离索引1最近的元素,其包含的数字小于A[1]=5。等等 我知道使用二叉搜索树的解决方案具有O(n*log(n))复杂性。如何将复杂性提高到O(n)或证明这是不可能的?除非我误解了这个问题,否则您可以通过简单的从左到右扫描来解决它,保留一个索引堆栈,其中您尚未遇到较小

这是一个算法优化问题

我有一个整数数组
A
,希望构建数组
B
,这样
B[I]
包含
A[j]
中元素的索引
j
,这样(
B[I]=j

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

B[0]=-1
,因为没有小于
1
且索引大于
0
的数字。
B[1]=3
,因为
A[3]
A
中距离索引
1
最近的元素,其包含的数字小于
A[1]=5
。等等


我知道使用二叉搜索树的解决方案具有
O(n*log(n))
复杂性。如何将复杂性提高到
O(n)
或证明这是不可能的?

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

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

下面的小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次
,因为每个元素只能执行一次。或者,换言之,每个元素最多一次被推和弹出

你没有误解,一切都很好,谢谢!我完全忘记了我可以再次使用stackchecked,b[1]不等于2,因为a[2]=6>5=a[1]
   A = [1,5,6,4,3,1,2]
   B = [-1,3,3,4,5,-1,-1]
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