我已经建立了一个持久性段树,但是现在有一些范围从某个索引更新到某个索引。如何以较低的复杂度更新持久性段树? 我只是重建持久性段树
答案 0 :(得分:0)
但是现在让我们说原始数组元素从1更新为3.现在数组元素是3 6 2 4 5.现在再次询问相同的查询。所以我应该重建整个持久性段树。
如果范围更新意味着以非公式方式更改范围中的每个元素,那么您最好的选择是对给定范围内的每个元素应用单元素更新。这将是O(range_sz * log n)
,其中n
是树中元素的数量。
我假设你知道如何在O(log n)
中执行单元素更新,如果没有请问。
但是,如果您的更新受到更多限制,例如“将范围内的所有元素设置为给定值v
”,则可以使用延迟更新:对于包含关联范围的分段树中的每个节点在更新范围内,将一些自定义字段设置为值v
。然后,在查询时,无论何时接受节点的范围(如果其范围包含在查询范围内),请选中此字段,如果有值,则将该值作为min / max
或您要查询的任何值对
这会将更新和查询保留在O(log n)
。