AVL树:在O(logn)时间内找到两个值之间的键中数据值最小的键

2024-03-27

所以我得到了一棵AVL树。我试图至少找出伪代码,以在两个值 k1 和 k2 之间的所有键中找到具有最小数据值的键。这是假设每个节点中存储的字段数据是整数。我想确保我的伪代码在 O(logn) 时间内运行。

我知道我可以通过在节点结构中存储一个额外的字段来做到这一点......并展示如何在更新期间维护该字段,但我不知道从哪里开始。


我们假设节点结构如下所示(Java)。

class Node {
    Node left;
    Node right;
    int key;
    int value;
    int tree_max;
}

复发为tree_max is

node.tree_max == max(node.value, node.left.tree_max, node.right.tree_max),

由于滥用符号,我们省略了node.left.tree_max when node.left为空并省略node.right.tree_max when node.right一片空白。每次我们写入一个节点时,我们可能都必须更新它的所有祖先。我不会编写伪代码,因为如果没有编译器,我很可能会出错。

查找键之间的最大值k1 and k2包含在内,我们首先找到这些节点的最不共同的祖先。

Node lca = root;
while (lca != null) {
    if (lca.key < k1) { lca = lca.left; }
    else if (k2 < lca.key) { lca = lca.right; }
    else { break; }
}

Now, if lca为 null,则范围为空,我们应该返回负无穷大或抛出异常。否则,我们需要找到三个范围内的最大值:k1包含于lca独家的,lca本身,以及lca专属于k2包括的。我将给出代码k1包含于lca独家的;其他两个范围分别是平凡的和对称的。我们走finger就好像我们在寻找一样从树上下来k1,将最大值累加到left_max.

int left_max = /* minus infinity */;
Node finger = lca.left;
while (finger != null) {
    if (k1 <= finger.key) {
        left_max = max(left_max, finger.value);
        if (finger.right != null) { left_max = max(left_max, finger.right.tree_max); }
        finger = finger.left;
    } else { finger = finger.right; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AVL树:在O(logn)时间内找到两个值之间的键中数据值最小的键 的相关文章

  • 如何最小化两个子多边形的最大纵横比?

    我想使用直线将凸多边形切成给定面积比的两部分 以使两个子多边形的较大纵横比最小化 目前我的方法包括选择一个随机起点 计算将多边形分割成目标区域的适当终点 然后计算两个纵横比中较大的一个 然后重复这个很多次 直到我足够接近最小值 多边形 A
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 在 O(n) 时间内运行的指数乘法算法?

    我正在读一本算法教科书 我被这个问题难住了 假设我们要计算值 x y 其中 x 和 y 为正数 分别具有 m 和 n 位的整数 解决该问题的一种方法是执行 y 1 乘以 x 你能给出一个仅使用 O n 乘法步骤的更有效的算法吗 这会是一个分
  • 如何找到最长的回文子序列(不是它的长度)

    我想找出字符串中最长的回文子序列 我到处都找到了找出子序列长度的算法 并声明该算法也可以扩展以返回子序列 但我没有找到如何实现的 有人能解释一下我怎样才能得到序列吗 既然你提到了链接最长回文子序列 http www geeksforgeek
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
  • 如何动态查找连接组件

    使用不相交集数据结构可以很容易地得到图的连通分量 而且 它只是支持增量连接组件 http www boost org doc libs 1 46 1 libs graph doc incremental components html 然而
  • 哪种数据聚类算法适合检测时间序列事件中未知数量的聚类?

    这是我的场景 考虑在不同地点和时间发生的一组事件 例如 考虑有人在高空记录暴风雨期间城市中的雷击 就我的目的而言 闪电是瞬时的 只能击中某些位置 例如高层建筑 还可以想象每次雷击都有一个唯一的 ID 以便以后可以参考该雷击 这个城市大约有1
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • 按百分比减少多边形面积

    我有一个由点 x y 组成的多边形 我想做的是将其减少一个百分比 请记住 我不想只是扩大规模 多边形应该有一种内部边界 其宽度取决于百分比 该内部边界被多边形切断 谁知道可以实现这一目标的算法 输入 点数组 百分比 输出 点数组 你所寻求的
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • 如何求解:T(n) = T(n - 1) + n

    我已经解决了以下问题 T n T n 1 n O n 2 现在 当我解决这个问题时 我发现界限非常松散 我是否做错了什么 或者只是这样 您还需要一个递归关系的基本情况 T 1 c T n T n 1 n 为了解决这个问题 您可以首先猜测一个
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • 检索受“rowspan”影响的行的列索引的最有效方法是什么?

    考虑下表 table thead tr th th th A th th B th th C th tr thead tbody tr th 1 th td Apples td td Oranges td td Pears td tr tb
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 如何将一组重叠范围划分为不重叠范围?

    假设您有一组范围 0 100 一 0 75 b 95 150 c 120 130 d 显然 这些范围在某些点上重叠 您将如何剖析这些范围以生成不重叠范围的列表 同时保留与其原始范围相关的信息 在本例中为范围后面的字母 例如 运行算法后的上述
  • 解释一下从 N 个给定集合中的每一个中给出第 K 个最大数字的示例?

    今天我尝试解决一个Facebook 编程挑战赛 https facebook interviewstreet com recruit challenges 我遇到的挑战是 酒吧问题 可以找到here https github com alo
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已

随机推荐

  • 当基本词以 I 开头时,如何命名接口?

    我想为 Items 创建一个界面 通常 我会通过在基本词中添加 I 前缀来命名接口 但在这种情况下 我的基本词已经以 I 开头 以下是我的一些想法 IItem 两个我 Iitem 情况不同 项目接口 跳过I前缀 写出Interface 什么
  • Java静态方法的优缺点

    我以前没有使用过很多静态方法 但最近我倾向于使用更多静态方法 例如 如果我想在类中设置一个布尔标志 或者访问一个类而不需要通过类传递实际对象 例如 public class MainLoop private static volatile
  • rabbitmq-erlang-client,使用 rebar 友好的 pkg,在开发环境上工作在 rebar 版本上失败

    我成功地将rabbitmq erlang client的rebar友好包用于一个简单的Hello World rebarized和OTP 兼容 应用程序 并且在开发环境中工作正常 我能够启动 erl 控制台并执行我的操作applicatio
  • MemberwiseClone 相当于现有对象吗?

    这里有很多关于 MemberwiseClone 的问题 但我找不到任何准确的内容 据我了解 MemberwiseClone 基本上只是复制对象的内存区域 将其转储到其他地方 然后将其称为该对象的新实例 显然非常快 对于大型对象来说 这是制作
  • 使用 .NET Core 3.1 sdk 时,有没有办法限制 .NET Core 项目仅生成 .dll 作为输出文件

    当我使用 NET Core 3 1 sdk 构建 NET Core 控制台应用程序时 它会生成 exe 和 dll 作为输出 当我使用 NET Core 2 1 时 它仅生成 dll 作为输出 有没有办法限制 NET Core 3 1 sd
  • 创建一个排除某些文件的补丁文件

    我想创建一个补丁文件 仅将某些文件从 dir2 修补到 dir1 两者都是同一项目的 git 存储库 但是 dir2 包含第一个版本的高度修改版本 我只想修补对某些文件所做的更改 dir2 还具有 dir1 没有的额外文件 主要是 dir1
  • 在 Ubuntu WSL2 上连接到本地主机的问题

    我在本地为 django 项目设置了 Apache2 服务器 并且运行得非常好 问题是 休息一天后我回到它并尝试连接到服务器 但不知何故我无法连接到它 即使在检查 apache 服务是否正在运行并重新加载配置以确保确定之后也是如此 我无法从
  • 在 Firefox 或我的代理中禁用 websocket

    我已将 Firefox 配置为使用我的 http 和 https 代理 是的 我自己编写代理代码 因此我可以完全控制代理 您可能知道 无法再通过 about config 在 Firefox 中禁用 WebSocket 我正在寻找一种轻量级
  • C# 参数中的键值对

    我正在寻找一种方法来实现以下功能 myFunction Key value Key2 value 我确信匿名类型的某些东西会非常简单 但我没有看到它 我能想到的唯一解决方案是params KeyValuePair
  • Angular 6 observables - 从 .subscribe() 函数中提取数据并在其他地方使用

    我用可观察到的东西把头撞在墙上 我能找到的几乎所有文档都是较旧的rxjs句法 我有一个可观察的 API 调用 我在其他地方调用它并订阅它 尝试用此数据填充表GET要求 如果我简单地console log my getData函数 它记录订阅
  • 构造函数与类 {proguard] 不匹配

    我在我的应用程序中启用 proguard 每当我构建应用程序时 我都会收到以下错误 Constructor not matched for class com acs nomad d b e 根据我的映射文件 它所指的类如下 package
  • Android - 条码片段结果不显示

    解决了 应用程序工作正常 不会崩溃 但应该将 resultView 文本从 Hasil Scan 更新为扫描结果 但事实并非如此 问题是扫描后文本视图 结果视图 未更新 我使用 DM77 Zxing 条码扫描仪 这是我到目前为止所做的代码
  • 在 Swift 中传递并打印枚举中的所有情况

    考虑这个简单的枚举 enum myEnum String case abc ABC case xyz XYZ 我想编写一个可以打印枚举中所有情况的函数 喜欢 printEnumCases myEnum 预期结果 ABC XYZ 注意 我可以
  • 尝试 UNINSTALL_SHORTCUT 但快捷方式不会消失

    我创建了一个测试活动 它在 Android 主屏幕上安装了它自己的快捷方式 当您单击按钮时 活动应该删除它刚刚创建的相同快捷方式 但是 我似乎没有做任何事情来删除快捷方式 下面是 Java 代码 ShortcutTest java impo
  • 为什么那些 Google 图像处理示例 Renderscript 在 Nexus 5 的 GPU 上运行速度较慢

    我要感谢斯蒂芬在上一篇文章中的快速回复 这是这篇文章的后续问题为什么非常简单的 Renderscript 在 GPU 中的运行速度比在 CPU 中慢 3 倍 https stackoverflow com questions 2038169
  • 无法在 SwiftUI 中获得正确的视图位置

    我试图获取 Button 的 midX 位置 但它总是给我意想不到的结果 我尝试过使用 global local 和 named 坐标空间 但它仍然不起作用 也许还有另一种方法可以在没有 GeometryReader 的情况下获取 UI 元
  • VSTS Build vNext NuGet 自定义包源

    我们有一份 Azure 企业协议 其中包含一个绑定了 VSTS 帐户的主订阅 我们设置了包管理扩展 以便为不同的项目托管一些有用的包 对于每个客户 我们在此 EA 中创建一个订阅并与其绑定一个 VSTS 帐户 我们在后一个订阅的托管构建代理
  • 删除一对多关系中的子项

    非常基本的 Hibernate 3 6 10 实现存在问题 我有两节课 日程表和活动 到达事件的唯一方法是通过时间表 因此我将其建模为具有许多事件的时间表的一对多关系 这是时间表 package com heavyweightsoftwar
  • 避免臭名昭著的“eval(parse())”构造

    好的 所以我正在运行一些循环来处理存储在列表对象中的数据 永远铭记那些臭名昭著的人fortune告诫不要使用eval parse mystring 我想出了这个 Rgames gt bar foo foo fast 1 1 2 3 4 5
  • AVL树:在O(logn)时间内找到两个值之间的键中数据值最小的键

    所以我得到了一棵AVL树 我试图至少找出伪代码 以在两个值 k1 和 k2 之间的所有键中找到具有最小数据值的键 这是假设每个节点中存储的字段数据是整数 我想确保我的伪代码在 O logn 时间内运行 我知道我可以通过在节点结构中存储一个额