如何有效地合并两个 BST?

2024-05-02

如何合并两个二叉搜索树并保持BST的性质?

如果我们决定从树中取出每个元素并将其插入到另一个元素中,则此方法的复杂度将为O(n1 * log(n2)), where n1是树的节点数(比如T1),我们已经拆分了,并且n2是另一棵树的节点数(比如T2)。执行此操作后,只有一个 BSTn1 + n2 nodes.

我的问题是:我们能做得比 O(n1 * log(n2)) 更好吗?


Naaff 的回答有更多细节:

  • Flattening a BST into a sorted list is O(N)
    • 这只是整个树上的“按顺序”迭代。
    • 两者都做是 O(n1+n2)
  • Merging two sorted lists is into one sorted list is O(n1+n2).
    • 保留指向两个列表头部的指针
    • 选择较小的头部并将其指针向前推进
    • 这就是归并排序的合并工作原理
  • Creating a perfectly balanced BST from a sorted list is O(N)
    • 请参阅下面的代码片段了解算法[1]
    • 在我们的例子中,排序列表的大小为 n1+n2。所以 O(n1+n2)
    • 生成的树将是二分搜索列表的概念 BST

O(n1+n2) 的三步结果为 O(n1+n2)

对于相同数量级的 n1 和 n2,这比 O(n1 * log(n2)) 更好

[1] 从排序列表创建平衡 BST 的算法(Python):

def create_balanced_search_tree(iterator, n):
    if n == 0:
        return None
    n_left = n//2
    n_right = n - 1 - n_left
    left = create_balanced_search_tree(iterator, n_left)
    node = iterator.next()
    right = create_balanced_search_tree(iterator, n_right)
    return {'left': left, 'node': node, 'right': right}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效地合并两个 BST? 的相关文章

随机推荐

  • 致命错误:iostream:没有这样的文件或目录#include

    我在学习C 的时候遇到了一个问题 编译的时候遇到了错误 The details are as follows You seem to have not installed C support in MinGW If you are usin
  • GoDaddy 服务器上的 CodeIgniter 和 URI 问题

    我似乎无法在 GoDaddy 上正确设置 CodeIgniter 我尝试在 wecome 控制器内创建一个新函数 但我无法在任何地方访问它 http domain com test No response lt why doesn t th
  • Linux 中的 Swift arc4random_uniform(max)

    我在 Ubuntu 中使用 Swift 收到一条错误消息 指出 arc4random 是一个无法解析的标识符 有关此已知错误的更多信息here https bugs swift org browse SR 685 基本上 该功能仅存在于 B
  • PostgreSQL:存在与左连接

    我多次听说 postgres 处理exists查询速度更快左连接 http archives postgresql org pgsql performance 2002 12 msg00185 php http archives postg
  • 在 SmartWizard 中后退时跳过验证

    我正在使用 SmartWizard 2 0 link http techlaboratory net products php product smartwizard 并且当用户点击 上一页 按钮或以任何方式在表单中向后移动时 我需要停止验
  • Android ImageView未加载

    我正在使用 android imageView 并将图像放入可绘制文件夹中 并将 imageView 源更改为该图像 但它没有在预览面板中显示图像 当我在 android studio 中打开图片时 它显示这样的错误 但我可以在电脑桌面上打
  • 在任何 PostgreSQL 语句(甚至不返回结果的语句)上调用 row_to_json(row)

    我正在寻找始终从 PostgreSQL 语句返回 JSON 表示的查询 即使没有returning 这是一个例子 WITH result AS insert into users name age values drew 42 select
  • 使对话框/活动始终位于顶部

    如何将对话框 活动保持在其他活动之上 无论用户是否在活动之间切换 它都应该始终处于活动状态 您可以使用相对布局作为父级 通过使用相对布局 您可以重叠其他布局 所以 你必须使用相对布局的两个子布局 在一个孩子中 您将弹出窗口 而在另一种布局中
  • 如何在spark Scala中读取s3中的多个目录?

    我在 s3 中有以下格式的目录
  • 屏幕上的中心 div 已使用 css3 旋转和缩放

    我有以下 jsfiddle https jsfiddle net quacu0hv https jsfiddle net quacu0hv 我不知道如何使这个 div 居中 事实上 它是旋转的 因此很难将对象真正置于屏幕上的中心 纯CSS到
  • 了解 Android 上的默认键盘

    我想知道 Android 中用户选择的默认键盘 我知道我可以使用以下命令访问启用的输入法列表InputMethodManager 但我想知道用户当前使用的是哪一个 到目前为止 我已经尝试获取当前的输入法子类型 InputMethodMana
  • Blazor 服务器端 - AWS 环境中频繁出现 504 错误

    通过 AWS Elastic Beanstalk 将 blazor 服务器端项目部署到 Amazon Web Services 环境后 该网站经常断开连接 我不明白 测试时这些断开连接不会在本地发生 Errors 2020 04 30T16
  • 无法在 web.config 中为 WCF Web 服务设置服务名称属性

    我编写了一个运行良好的 WCF Web 服务 然后我从另一个应用程序复制了该 Web 服务的内容 并创建了一个新的 WCF 文件 该文件在 web config 中创建了一个新文件 但名称属性显示找不到命名空间 以下是我的 WCF 前几行的
  • 开源协同过滤框架

    我想知道是否存在任何开源框架可以帮助我在我的网站中包含以下类型的功能 1 如果我正在查看特定产品 我想看看我可能感兴趣的其他产品 该信息可以通过计算例如除了我正在查看的产品之外我所在地区的其他人 或我的个人资料的任何其他特征 购买的内容来推
  • 如何观察Firebase存储上传事件

    我有一个将照片上传到 Firebase 存储的 iOS 应用程序 以及一个连接到同一个 Firebase 的 Web 应用程序 有没有办法从网络上观察存储的变化 当上传照片时 只有iOS设备本身可以访问UploadTask 并且我没有看到o
  • HtmlAgilityPack 有属性吗?

    我想做的就是 node Attributes class Value 但如果节点没有class属性 就崩溃了 所以 我必须先检查它是否存在 对吧 我怎么做 Attributes不是一个字典 它是一个包含内部字典的列表 并且没有 HasAtt
  • Visual Studio在其他计算机上远程上传和调试

    有没有办法在另一台计算机上远程上传 运行和调试应用程序 我知道您可以将 Visual Studio 远程调试器附加到远程计算机上运行的应用程序 但我正在寻找一种完全自动化的方法来执行此操作 我正在构建一个家庭自动化系统 如果我能为 Visu
  • QWebView / Qt WebKit 不会打开某些 SSL 页面;不允许重定向?

    在带有 Visual C 2008 SP1 的 Windows 7 上全新安装 Qt SDK 1 1 4 我正在使用 Qt Creator 为什么此代码无法加载某些网页 include
  • 围绕右下角对齐图像

    我正在使用相对布局将一个较小的图像叠加在较大的图像之上 我希望较小图像的右下角与较大图像的 B R 角重合 我在布局 XML 中使用边距参数 指定倾斜测量 但这似乎不适用于所有设备和分辨率 在某些情况下 小图像会从边框移动 4 5 像素 是
  • 如何有效地合并两个 BST?

    如何合并两个二叉搜索树并保持BST的性质 如果我们决定从树中取出每个元素并将其插入到另一个元素中 则此方法的复杂度将为O n1 log n2 where n1是树的节点数 比如T1 我们已经拆分了 并且n2是另一棵树的节点数 比如T2 执行