大范围连续整数的数据结构?

2024-01-08

假设内存中有大量连续整数,每个整数都属于一个类别。两个操作必须是 O(log n):将范围从一个类别移动到另一个类别,以及查找给定范围的类别计数。

我很确定只要第一个操作的正确实现,第二个操作就可以轻松解决。

每个整数都从一个类别开始,因此我从一组平衡的 BST 开始。将子树从一个 BST 移动到另一个(例如,将范围移动到不同类别)的运行时间相当于合并两个 BST,即 O(n1 * n2)[1 https://stackoverflow.com/questions/1008513/how-to-merge-two-bsts-efficiently].

这太慢了(在 python 中,C 不是一个选项),而且我无法找到一种方法来利用数据的固有结构来创建高效的 BST 合并操作。

我现在正在研究 AVL、红黑树、区间树、二叉堆和 Treap。比较它们的特性是压倒性的。我应该使用哪种结构?

编辑(问题澄清):我可以灵活地存储这些值并创建数据结构。我对如何接收来自另一个应用程序的输入不灵活,如下所示:CATEGORY(cat3, I, J)。我当前的解决方案为该范围内的每个整数创建一个带有节点的树。对于我的数据集的大小来说,这太慢了,所以如果有更好的方法,我很乐意重新架构。

任何给定的请求都可以将任何可能的整数范围移至任何类别。换句话说,范围在某种意义上是重叠的CATEGORY(cat1, 1, 10)其次是CATEGORY(cat3, 5, 15),但非重叠是指每个整数在任何给定时间都恰好属于一个类别。


据我理解,你有一个范围 [A,B] 和以下形式的查询 -

  1. 将特定范围分配给类别


E.g.
R1 R2 C1
R3 R4 C2
  
  1. 查询特定类别中项目总数的范围。 例如。查找 R1 R4 中的类别数

使用上面给出的字典的简单实现不会像我在这个例子中描述的那样工作 -

假设我们有一个范围 [1000, 5000]

我们的分配如下 -



1 2 C1
2 3 C2
3 4 C3
......
4999 5000 C4999
  

现在我们进行以下分配



1 5000 C5555
  

这将对之前分配的范围 O(N) 进行更新/更改/删除,其中 N 是范围的最大大小 (B - A)

D['类别'] = set(of_all_the_ranges_you_have_in_category)

在这种情况下,最后一次分配需要从类别 C1、C2...C4999 中的相应集合中删除先前的范围 ( 1 5000 C5555 )

OR

1:{“停止”:5,“类别”:“C1”}, 6:{“停止”:19,“类别”:“C23”},

此处,最后一次分配 ( 1 5000 C5555 ) 需要更新每个起始值 (1,2,3,4...,4999) 的类别

在 O(lg n) 内更新范围的更好选择是线段树 (http://en.wikipedia.org/wiki/Segment_tree http://en.wikipedia.org/wiki/Segment_tree )

对于上面的例子,线段树看起来像这样

                   1000:5000
                      |
             ---------------------
             |                   |
           1000:3000         3001:5000
            |                    |
    ----------------      --------------------
   |               |      |                  |
 1000:2000     2001:3000   3001:4000       4001:5000

...................................................... ............ ...................................................... ............. 等等

叶节点将具有范围(1:2、2:3,...)

您可以为每个节点分配一个值“类别”,并给定一个区间,遍历树并适当地划分区间(例如,对于 2500 到 4500,划分为 2500:3000 和 3001:4500,并在两个方向上进行,直到找到具有匹配范围的节点) 。

现在有趣的事情是在需要时更新节点的子节点。例如,在执行 1 5000 C5555 等作业时,不要立即继续更新子级。这个东西叫做惰性传播,你可以在这里了解更多信息( ).

现在进行查询部分。如果类别数量非常少,您可以在每个节点维护一个频率表,并在需要时更新范围,并在需要时延迟传播,否则,您将不得不从叶子到节点遍历整个树,计数和复杂度将变为 O (n)。

我认为可能存在更好的查询解决方案。我没有想到这一点。

UPDATE让我们举一个小例子。

范围 [1,8]

允许的类别 {C1, C2}

        1:8
     1:4         5:8
     1:2  3:4      5:6    7:8
 1:1 2:2 3:3 4:4  5:5 6:6 7:7 8:8

每个节点将有3个字段[category,category_counts[],children_update_required = false]

1 5 C1

查询将被划分,节点 1:4 的类别将设置为 C1,children_update_required 将设置为 true,其子级现在不会更新(记住仅在需要时更新或延迟传播)。另外,节点 5:5 的类别将设置为 C1

3 4 C2

查询将沿着树向 3:4 传播(在到达 3:4 的过程中,1:2 和 3:4 的类别将更新为 C1,1:4 的 Children_update_required 将设置为 false,1:2 和 3 :4的children_update_required将被设置为true),现在将根据当前要求将3:4的类别更新为C2。接下来,它会将 3:4 所需的 Children_update 设置为 true,以便将来更新其子级(在本例中已经设置了..不会造成任何损害)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

大范围连续整数的数据结构? 的相关文章

随机推荐

  • 错误1001。初始化安装时发生异常

    我在尝试卸载时看到以下错误 程序文件中没有WRT文件夹 如何卸载该软件 注意 我已从程序文件中删除了软件文件夹 错误信息 System IO FileNotFoundException could not load file or asse
  • 如何检查 Java 8 Streams 中是否存在重复项?

    在 java 8 中 检查列表是否包含重复项的最佳方法是什么 我的想法是这样的 list size list stream distinct count 这是最好的方法吗 您的代码需要迭代所有元素 如果你想确保没有重复的简单方法 例如 pu
  • 如何为 HTML div 标签设置边框

    我正在尝试在 HTML 中定义 div 标签周围的边框 在某些浏览器中 边框不会出现 这是我的 HTML 代码 div style border thin div
  • 计算嵌套对象中的键数

    我正在尝试统计嵌套 JS 对象中的键 我能够到达第一层 但我有点困惑如何让它深入嵌套对象并返回计数 var properties prop1 prop2 prop3 prop4 subProp1 subProp2 subProp3 subS
  • 设置 eclipse java SE-1.7

    我想开始学习java 但是Eclipse给我带来了一些麻烦 首先 我是一个Java初学者 对它知之甚少甚至一无所知 我想使用 JavaSe 1 7 除了使用最新版本之外 我没有明确的理由使用它 下载 Eclipse 适用于 Java 开发人
  • 为什么非成员 static constexpr 变量不是隐式内联的?

    在 C 17 中 我们得到了内联变量 并且我假设全局 constexpr 变量是隐式内联的 但显然这只适用于静态member变量 这背后的逻辑 技术限制是什么 source 声明为 constexpr 的静态成员变量 但不是名称空间范围变量
  • 当底层模型更改时,QT QmlMap PolyLine 未正确更新

    我正在尝试将多个地理坐标与地图中的折线连接起来 坐标存储在模型 QAbstractListModel 类中 我可以在其中修改 删除和添加 C 中的坐标 简单地显示每个坐标的标记就可以了 但是当我将它们与折线连接并从模型中删除一些现有坐标时
  • 将 Base64 字符串加载到画布时遇到问题

    我正在尝试将 Base64 字符串从数据库加载到画布 我通过执行相反的方法获得了这个字符串 在画布上绘制后将其保存到我的数据库中 所以 现在我想将其加载回另一个画布上 我已经尝试过在网络和 StackOverflow 上其他地方找到的这段代
  • 尝试使用 getRange 时出现类型错误

    NOTE This is a proposal of canonical Q A Please discuss it on Meta https meta stackoverflow com q 420764 1595451 作为新的 Go
  • 使用数据框架构的 Spark 地图数据框

    我有一个从 JSON 对象创建的数据框 我可以查询这个数据框并将其写入镶木地板 由于我推断了架构 因此我不一定知道数据框中的内容 有没有办法使用自己的架构来输出列名称或映射数据框 The results of SQL queries are
  • 如何检测浏览器何时在 Web 登录中输入存储的密码

    我有一个网站 可以检测何时输入用户名和密码 然后启用登录按钮 问题是 如果浏览器输入它记住的用户名和密码 则登录按钮永远不会启用 JavaScript 有没有办法检测浏览器输入此信息 你可以用以下方式进行轮询setInterval 但是为什
  • 如何将 Invoke-RestMethod 的响应转换为 XML?

    参考help https learn microsoft com en us powershell module microsoft powershell utility invoke restmethod view powershell
  • 将 URL 参数传递到 HTML 表单 Google Web App

    我已经浏览了大部分与此相关的问题 但没有找到对我有帮助的解决方案 我已经一一应用了它们 我有一个 HTML 表单 我正在通过 google 将其发布为网络应用程序 我需要用该参数预先填充输入框 code gs function doGet
  • 为什么 March=native 会破坏我的程序?

    我正在编译程序 include
  • 如何让liveserver渲染django模板?

    我一直在搞一个教程网站 我发现当我尝试打开 Django 模板时 我的 VS Code LiveServer 插件无法正常工作 我应用的 CSS 丢失了 尽管一切都在我的本地开发服务器中正确呈现 并且模板语言代码实际上被打印到屏幕上而不是被
  • 如何创建/管理作业队列[重复]

    这个问题在这里已经有答案了 我有一个有序列表中包含数千个 shell 作业的队列 我需要从上到下并行运行 4 个作业以避免 CPU 饱和 如果我只是将作业列表拆分为 4 个批处理脚本 则运行时不会对齐 其中一个脚本将远远领先于其他脚本 但仍
  • STOMP 或 XMPP - 通过 websocket

    我正在开发一个涉及实时聊天 消息传递 包括群聊 的项目 我以前使用过 websockets 所以我开始使用 spring websockets 来研究这个问题 并且我阅读了一些关于实现它的最佳方法的文章 然后我遇到了 STOMP 作为 we
  • 使用 Capistrano,如何回滚到特定版本?

    使用 Capistrano 如何回滚到特定版本 我的服务器文件夹中有一个 release 文件夹 我如何回滚到特定的文件夹 我是否可以在本地计算机上获取版本列表 我正在使用 GIT 但这不起作用 cap deploy s revision
  • 打字稿“不是索引器的子类型”,是什么意思?

    我正在通过阅读来学习 Typescript这份官方文件 https www typescriptlang org docs handbook interfaces html关于索引器类型 我无法理解这段代码 interface Number
  • 大范围连续整数的数据结构?

    假设内存中有大量连续整数 每个整数都属于一个类别 两个操作必须是 O log n 将范围从一个类别移动到另一个类别 以及查找给定范围的类别计数 我很确定只要第一个操作的正确实现 第二个操作就可以轻松解决 每个整数都从一个类别开始 因此我从一