Arrays 使用静态范围最小查询维护的数组中单个更改的复杂性
我在数据结构课程中进行了一次测试,其中一个问题是: 假设您有一个n大小的数组,该数组使用范围最小查询进行维护,该查询以o(1)的复杂度给出数组中两个数字之间的最小值。 当然,数组是o(n)准备好回答RMQ的,使用动态规划来解决不同的选项。 问题是-如果我更改数组中的一个对象(数字),我将如何更改我所做的准备,以便仍然可以在o(1)中找到RMQ,以及需要多大的复杂性 答案不是在o(n)中生成新的RMQ,它必须小于该值 这个问题不是家庭作业,我只是想通过考试来理解Arrays 使用静态范围最小查询维护的数组中单个更改的复杂性,arrays,algorithm,data-structures,rmq,cartesian-tree,Arrays,Algorithm,Data Structures,Rmq,Cartesian Tree,我在数据结构课程中进行了一次测试,其中一个问题是: 假设您有一个n大小的数组,该数组使用范围最小查询进行维护,该查询以o(1)的复杂度给出数组中两个数字之间的最小值。 当然,数组是o(n)准备好回答RMQ的,使用动态规划来解决不同的选项。 问题是-如果我更改数组中的一个对象(数字),我将如何更改我所做的准备,以便仍然可以在o(1)中找到RMQ,以及需要多大的复杂性 答案不是在o(n)中生成新的RMQ,它必须小于该值 这个问题不是家庭作业,我只是想通过考试来理解 提前感谢。根据更新和查询的复杂性,
提前感谢。根据
更新
和查询
的复杂性,RMQ
实际上有三种算法:
Update Query
1. O(N) O(1)
2. O(1) O(N)
3. O(logN) O(logN)
第一类和第二类算法实现起来非常简单。第一个涉及存储所有可能查询的值,从而在O(1)
时间内回答它们。第二种方法是在O(1)
时间内更新数据结构,但查询需要O(N)
。根据你的问题,你不可能有这样的组合
然而,第三类算法特别令人感兴趣。如果您放宽查询可能需要O(logN)
时间的条件,而不是O(1)
,那么您也将有一个优势,即无论更新和查询的数量如何,总体运行时间保持不变
好的,用于获取这种运行时间的最佳数据结构是和存储已更改元素的索引I和新值V 在获取查询[L,R]时,检查