二叉搜索树过滤某个范围内的值

2024-03-25

我有一棵由 N 个元素组成的树(RBT)。假设我有这棵树(N = 7):

           4
    2             6
1       3      5     7

如何以比 O(N) 更好的性能过滤某个范围内的值(例如打印 3 到 6 之间的所有值)?

有具体的算法吗?我想象它类似于找到值 3 [log(N)] 的位置,以某种方式继续,直到到达 6 [O(M)]。


如果您有 Sedgevick 算法,第 4 版,请查看第 3.2 章末尾有关 BST 的内容。还预订伴侣 https://algs4.cs.princeton.edu/33balanced/RedBlackBST.java.html有Java实现。

基本算法非常简单:对树进行递归中序遍历。将左子树中的键放入队列(或任何容器)中,然后将键放在根中,然后将所有键放入右子树中。仅添加指定范围内的键,并跳过对不能包含范围内的键的子树的递归调用。

你可以试试这个here https://dotnetfiddle.net/pzR4sY- 这是一个基本的 BST(范围查询与 RBT 中的工作方式相同),获取 3 到 6 之间的值。

算法本身:

public IEnumerable<T> Keys(T low, T high)
{
    var queue = new Queue<T>();
    Keys(Root, queue, low, high);
    return queue;
}

private void Keys(Node node, Queue<T> queue, T low, T high)
{
    if (node == null)
        return;

    int cmpLow = low.CompareTo(node.Key);
    int cmpHigh = high.CompareTo(node.Key);

    if (cmpLow < 0)
    {
        Keys(node.Left, queue, low, high);
    }
    if (cmpLow <= 0 && cmpHigh >= 0)
    {
        queue.Enqueue(node.Key);
    }    
    if (cmpHigh > 0)
    {
        Keys(node.Right, queue, low, high);
    }
}

复杂度应该是O(h + k), where h是树的高度,k是范围内的值的数量。 还可以看看范围树 https://en.wikipedia.org/wiki/Range_tree擅长范围的数据结构。

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

二叉搜索树过滤某个范围内的值 的相关文章

  • 非不相交集并集的最佳算法是什么?

    假设有两个 非不相交 点集 笛卡尔空间 执行这两个集的并集的最佳情况复杂度算法是什么 由于点坐标是任意的 并且它们之间没有特殊关系 因此我不认为这个问题是一个几何特定问题 这是有效地将 S1 和 S2 合并成新集合 S 的通用问题 我知道有
  • 分形加密

    我听说可以使用 Mandlebrot 集的图来加密数据 并且这种加密算法是量子安全的 与许多常用算法不同 不能用量子计算机破解 我在 Google 上查找更多信息 但只找到了一些针对非技术受众的文章 有谁有任何这方面的资源 我可以用它来了解
  • 如何检测(心电图)波的模式?

    我正在尝试读取心电图图像并检测其中的每个主波 P 波 QRS 波群和 T 波 我可以读取图像并获得向量 例如 4 2 4 4 4 9 4 7 我需要一种算法来遍历这个向量并检测每个波何时开始和结束 一个例子 如果它们总是具有相同的大小 或者
  • 分配不同价值对象的算法建议

    我有以下问题 给定 N 个对象 N 编辑 通过最公平的分配 我的意思是任何两个玩家获得的物体的价值之间的差异是最小的 另一个类似的情况是 我有N个不同价值的硬币 我需要将它们平均分配给M个玩家 有时他们并没有完全分开 我需要找到下一个最佳的
  • 在 O(n) 时间和 O(1) 空间中生成数组的随机排列

    我们必须生成数组 1 2 3 n in O 1 space 我能够做到O n space I did O n 空间解决方案 首先存储数组 然后将其随机化 但是如何在不存储数组的情况下做到这一点O 1 space 我只是生成随机数 而不是存储
  • 如何正确区分树(即嵌套的字符串列表)?

    我正在使用由嵌套字符串列表组成的数据类型的在线编辑器 请注意 如果每次更改单个值时我都要传输整个结构 那么流量可能会变得难以忍受 所以 为了减少流量 我想到了应用 diff 工具 问题是 如何找到并报告两棵树的差异 例如 ah bh ha
  • 对于基准测试和压力测试子串搜索算法有哪些好的测试用例?

    我正在尝试评估不同的子字符串搜索 ala strstr 算法和实现 并寻找一些精心设计的针和干草堆字符串 这些字符串将捕获最坏情况的性能和可能的极端情况错误 我想我可以自己解决它们 但我认为有人必须在某个地方收集大量测试用例 一些想法和对自
  • 这段代码的复杂度是多少? (大O)这是线性的吗?

    for int i 0 i
  • 快速排序和调整快速排序有什么区别?

    快速排序和调整快速排序之间的根本区别是什么 快速排序有何改进 Java 如何决定使用它而不是合并排序 正如蜥蜴比尔所说 调整的快速排序仍然具有与基本快速排序相同的复杂性 O N log N 平均复杂度 但调整的快速排序使用一些不同的方法来尝
  • 谷歌采访:找到多边形的最大和[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 给定一个多
  • 背包多重约束

    我有一个动态规划问题 我花了几个小时研究但没有结果 第一部分很简单 你有一背包物品 你必须最大化这些物品的价值 同时将它们保持在一定的重量以下 问题的第二部分是相同的 只是现在也有一个项目限制 例如 您可以放入袋子中的物品的最大价值是多少
  • 强连通分量有什么用?

    我发现了几种可以解释的算法how在有向图中找到强连通分量 但没有解释why你会想要这样做 强连通分量有哪些应用 您应该查看 Coursera 上 Tim Roughgarden 的算法简介课程 对于他所讨论的每一种算法 他都会解释其一些应用
  • 根据 1 的数量查找数字的排名

    令 f k y 其中 k 是非负整数递增序列中的第 y 个数 其二进制表示形式中的 1 数量与 k 相同 例如f 0 1 f 1 1 f 2 2 f 3 1 f 4 3 f 5 2 f 6 3 等等 给定 k gt 0 计算 f k 我们很
  • 如何在文本文件中找到最长的 N 行并将其打印到标准输出?

    第一行包含数字 N 的值 后跟多行 我可以按照n 2算法的顺序解决它 有人可以建议一个更好的吗 您可以使用最小堆并在 O n log N 中完成 heap new Min Heap N foreach line in text if len
  • 是否可以有效地计算 lambda 演算项?

    我最近用 lambda 演算编写了很多程序 我希望能够实时运行其中一些程序 然而 尽管趋势函数范式基于 lambda 演算和 B 约简规则 但我找不到一个不是玩具 不以效率为目的的评估器 函数式语言应该很快 但我所知道的那些语言实际上并不提
  • Linux命令:如何仅“查找”文本文件?

    经过几次谷歌搜索后 我得出的结论是 find my folder type f exec grep l needle text exec file grep text 这非常不方便 并且会输出不需要的文本 例如 mime 类型信息 还有更好
  • 删除两个元素将数组平均分成三部分,时间复杂度为 O(n)

    我遇到一个问题 让您删除数组中的两个元素以使三部分的总和相等 Ex 1 2 4 3 5 2 1 After I drop the 4 and 5 it becomes 1 2 3 2 1 限制条件 1 Numbers are all int
  • 用于搜索内部文件的 ssh 命令

    几周前 我的两个网站可能被 ftp 暴力攻击所利用 破坏了我网站的许多文件 我发现他们通常会在js或php文件中插入以下代码 Trojan code removed as irrelevant to this question 我想通过 s
  • 通过 DFS 查找图中的强连通分量

    我正在阅读有关 BFS 和 DFS 的图算法 当我分析通过DFS在图中查找强连通分量的算法时 我想到了一个疑问 为了找到强连通分量 书 Coremen 做了什么 首先它在图上运行 DFS 以获得顶点的完成时间 然后再次以完成时间的降序在图的
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https

随机推荐

  • 使用 DOS 批处理文件从文件中删除某些内容

    我有一个文件 Text dat 其中包含一些不需要的数据 我需要编写一个 DOS 批处理文件来删除不需要的数据 并将其放入其他文件 例如 file2 dat 中 并保留包含所需数据的原始文件 请帮忙 代替find我会用findstr哪个更强
  • 使用点符号导入自定义包的子模块?

    我猜这个问题可能已经得到解答 但我所有的搜索都发现了其他导入问题 话又说回来 也许我只是不知道要搜索的正确术语 如果我创建一个带有模块的包 似乎我可以使用from mypackage import mymodule to use mymod
  • 在 Firefox 中使用 CSS 实现圆角

    我实际上想把桌子内的角弄圆 就我而言 这似乎是不可能的 我已经尝试了几乎所有的方法 但我无法让它发挥作用 问题是我基本上有一张桌子 其螺纹具有特定的颜色 比如说黑色 我想通过将其角磨圆来给它一点圆角 谁能告诉我这怎么可能 这是我到目前为止尝
  • 注册django后发送确认邮件

    我在 django 应用程序中完成注册过程后发送了一封电子邮件确认 出于安全原因 我需要找出如何验证在 url 中发送的代码 而不在用户模型中添加新的代码字段 到目前为止 我在 url 和用户名中发送了一个随机代码 该代码已验证但不是代码
  • 使用 Modelmapper,如何映射到没有默认/无参数构造函数的类?

    我想映射到一个只有一个带有 3 个参数的构造函数的源目标 我收到以下错误 无法实例化目标 com novasol bookingflow api entities order Rate 的实例 确保 com novasol bookingf
  • 有没有办法在 Angular 中单击按钮时从 SQL Server 数据库表下载数据的 csv 文件

    我需要将 SQL Server 数据库表中的所有数据放入一个 csv当我单击前端 Angular 网页中的按钮时 会生成一个文件 我已经用 C 编写了一个 Web API 来访问 SQL Server 表中的所有数据并将其显示在我的网页中
  • 将 keras ImageDataGenerator.flow_from_directory() 与 Talos Scan() 结合使用

    Talos 是一个模块 允许您对已经编写代码的 keras 模型进行超参数调整 在示例中使用它的传统方式是Scan实例化的类x and y参数 这些参数应包含一个分别包含训练数据和标签的数组 def modelbuilder x train
  • Rails 中的 ActiveModel::Serializer - JSON 结果中忽略序列化器方法

    我在用active model serializers https github com rails api active model serializers为我的 Rails 模型创建 JSON 串行器 class OptionSeria
  • 如何从 umbraco CMS 导出数据?

    我有一个使用 umbraco cms 的项目 即 MSSQL 现在我们正在 WordPress 中重建网站 我无法理解其中的关系 在乌布拉科这很困难 所以我想直接从 Umbraco CMS 下载 导出内容 但在 cms 中我找不到任何导出批
  • 在 Xamarin UWP 中创建包后,视频仅通过语音播放,我看不到视频

    我正在使用最新版本的 MediaManager 插件来播放视频 当我在调试模式下运行应用程序时 一切正常 但是当我为窗口创建包时 视频不显示 只听到声音 我正在使用下面的包 插件 MediaManager Forms 这是我的 XAML 页
  • 在 ruby​​ 中定义全局方法的方法

    我正在写一个小 gem 我想定义一个类似 DSL 的方法 与desc and task中的方法Rake Rake 将它们定义为私有方法Rake DSL模块然后 self extend Rake DSL 将模块混合到主对象中 我是新手 如有错
  • 如何在 iOS 中访问 JPEG COM 段?

    JPEG 有很多标记段级别 我想读取和写入注释标记段级别 COM 读 写 它需要低级编程 我如何在 iOS 中访问它 参考 http help accusoft com ImageGear v18 1 Mac IGDLL 10 05 htm
  • 在 Adob​​e Flex 中将数据写入文本文件

    我是 Adob e Flex 新手 我想将存储在字符串变量中的一些数据写入文本 txt 文件中 有人可以在这里添加示例代码对我有帮助吗 谢谢 如果您的目标是 Flash 10 则可以写入文件 阅读本文以了解如何执行此操作 http www
  • 我怎样才能同时捕获 2 个以上的按键?

    最近我对创建 JS 游戏产生了兴趣 不是我有经验但我感兴趣的领域 我知道有几个 JS 游戏引擎 但我并不是真的想创建一个游戏 相反 我很好奇事物是如何工作的 我如何创建一个 我有几个问题 有人建议我在哪里可以阅读它吗 先决条件 需要什么知识
  • 从数据库 php 和 mysql 检索图像的损坏文件图标

    我需要从数据库上传和检索图像 我可以将图像存储在数据库中 但稍后无法显示 请帮忙 我编写了以下代码来从数据库中检索 result1 mysql query INSERT INTO userdata id username firstname
  • 从 SQL 存储过程导出文本文件

    我当前有一个进程存在于 2 个导出文本文件的 MS Access 数据库中 此过程在一天中发生两次 一次是在设定时间触发的自动化过程中 第二次是由应用程序前端的用户触发 这在两个数据库中都是相同的 现在我们正在将此应用程序重写为 SQL S
  • 基于代理/参与者的并发设计的设计模式[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 最近 我一直在研究支持参与者 代理 无共享架构的替代语言 即 scala clojure 等 clojure 也支持共享状态 到目前为止 我读过
  • 为什么 **find** 没有找到任何东西?

    我正在寻找安装在我的系统上的 shell 脚本文件 但是find不起作用 find usr name sh 但我知道那里有大量的脚本 例如 ls usr local lib sh usr local lib tclConfig sh usr
  • 为什么我在 Next.js 中得到这个? 具有无效的 `imagesrcset` 值

    我的轮播中有图像
  • 二叉搜索树过滤某个范围内的值

    我有一棵由 N 个元素组成的树 RBT 假设我有这棵树 N 7 4 2 6 1 3 5 7 如何以比 O N 更好的性能过滤某个范围内的值 例如打印 3 到 6 之间的所有值 有具体的算法吗 我想象它类似于找到值 3 log N 的位置 以