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