这是715. leetcode上的范围模块,这很困难。
标签:“线截面树”,“线截面树(动态开放点)”
模块是一个跟踪数字范围的模块。设计数据结构以跟踪半开放间隔的范围并查询它们。
半开机间隔$ [左,右)$表示所有$左<= x <right $的实际数字。
实施类:
示例1:
暗示:
$ m $的总数是通话总数,$ n = 1e9 $是值域的大小。
由于较大的价值域,我们不能直接在空间的大小中直接使用固定在$ 4 imes n $的传统线,我们必须使用“动态开放点”方法。动态开放点有两种方法:“您需要为估计点执行一个估计点。“数组实现”和“无估计点的动态指针”。
设计节点维护哪些信息:
为了实现常规线树的实现,它被称为在开头创建一个空的树,而线树通常以“完整二进制树”的形式存储在数组中。因此,空的树被锁定了。
如果一个问题只是“大价值域”的离线问题(提前知道所有查询),我们还可以通过“离散”处理它,并将值域映射到一个小空间以解决问题。
但是,对于这个问题,由于“强制性在线”原因,我们无法“离散”,价值域的大小达到$ 19 $。因此,如果我们想使用“线树”“开放点”。
动态开放点的优点是,不需要事先构造一个空的树,而是根据需要插入和查询操作的“开放点”操作。由于我们不保证查询和插入是连续,对于父节点$ u $ u $,我们无法访问固定的和谐方法,但是我们必须将节点$ tr [u] $左和右节点。存储分别记录为和谐属性。[u] .ls = 0 $和$ tr [u] .s = 0 $,尚未创建代表性的子节点。当需要访问它们时,它们是在未创建时创建的。
由于“懒惰标签”,行树的插入和查询是$ log {n} $,因此,当我们操作一个操作时,我们将创建$ log {n} $的订单的最大点因此,空间复杂性将为复杂性是$ o(mlog {n})$,而不是$ o(4 imes n)$,并且开放点的估计估计不能仅基于$ log {n} $,并且有必要分析长舒(Changshu),以获得上限的准确点。
与原始的线树相比,动态开放点仍以“完整二进制树”的形式存储。这只是按需创建范围。如果我们根据连续部分查询或插入,最坏的情况仍然是最坏的情况。它的空间为$ 4 imes n $,因此盲人猜测$ log {n} $的常数为$ 4$。可以直接估计为$ 6 $,因此我们可以估计其中的点数为$ 6 imes m imes log {n},其中$ n = 1e9 $和$ m = 14 $代表值域的大小和查询时间的数量。
当然,一种更实用的点方法可以“尽可能多地打开点”,并使用主题给出的空间和我们创建的大小(结构)的大小。$ 5 imes 10^6 $)。
代码:
由“动态指针”实现的“动态开放点”可以有效地避免数组估计的问题。更重要的是,它可以有效地避免大型数组的初始化。考虑到优化/全局数组优化,动态指针的方式比估计方法更好。
代码:
这是我们“通过Leetcode”系列的第一篇文章。该系列始于2021/01/01。从开始开始时的起始代码开始,总共有1916年的问题。该主题已经完成。
在这一系列文章中,除了解释问题 - 解决想法之外,还将尽可能多地提供最简洁的代码。如果涉及通信,将有相应的代码模板。
为了使学生更容易在计算机上调试和提交代码,我建立了一个相关的仓库:https://github.com/sharingsource/logicstack-letcode。
在仓库地址中,您可以看到一系列文章的解释链接,一系列文章的相应代码,leetcode的原始链接以及其他首选解决方案。
原始:https://juejin.cn/post/7111154936200560677