从整数流创建平衡二叉搜索树

2024-03-11

我刚刚结束了一次工作面试,我一直在纠结这个问题,在我看来,在 15 分钟的面试中这是一个很难回答的问题。

问题是: 编写一个函数,给定整数流(无序),构建平衡搜索树。 现在,您不能等待输入结束(它是一个流),因此您需要动态平衡树。

我的第一个答案是使用红黑树,这当然可以完成这项工作,但我必须假设他们没想到我会在 15 分钟内实现红黑树。

那么,对于我不知道的这个问题有什么简单的解决方案吗?

Thanks,

Dave


我个人认为最好的方法是使用随机二叉搜索树,例如treap http://en.wikipedia.org/wiki/Treap。这并不能绝对保证树会平衡,但树很有可能具有良好的平衡因子。 Treap 的工作原理是用均匀随机数增加树的每个元素,然后确保该树对于键而言是二叉搜索树,对于均匀随机值而言是堆。插入陷阱非常容易:

  1. 选择一个随机数分配给新添加的元素。
  2. 使用标准 BST 插入将元素插入 BST。
  3. 当新插入元素的键大于其父元素的键时,执行树旋转以使新元素位于其父元素上方。

最后一步是唯一真正困难的一步,但如果您有时间在白板上解决它,我很确定您可以在面试中即时实现这一点。

另一个可能有效的选择是使用八字树 http://en.wikipedia.org/wiki/Splay_tree。这是另一种类型的快速 BST,假设您有标准的 BST 插入函数和进行树旋转的能力,就可以实现它。重要的是,八字树是极其在实践中速度很快,并且众所周知,它们(在恒定因子内)至少与任何其他静态二叉搜索树一样好。

根据“搜索树”的含义,您还可以考虑将整数存储在某种针对整数查找而优化的结构中。例如,您可以使用按位特里树 http://en.wikipedia.org/wiki/Trie#Bitwise_tries存储整数,它支持与机器字中的位数成比例的查找时间。使用递归函数来查看这些位可以很好地实现这一点,并且不需要任何类型的旋转。如果您需要在十五分钟内完成一个实现,并且面试官允许您偏离标准二叉搜索树,那么这可能是一个很好的解决方案。

希望这可以帮助!

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

从整数流创建平衡二叉搜索树 的相关文章

  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 合并空间上接近的路径/线段的算法

    我正在寻找一种用于街道地图制图概括的几何算法 名称 在我的地图数据中 我有许多路径 点的有序列表 由线段连接 这些路径彼此靠近且几乎平行 我如何 1 识别这些 相邻路径 即如何找到比某个阈值更接近的路径 以及 2 将它们合并成一条路径 即如
  • 在 O(n) 时间内运行的指数乘法算法?

    我正在读一本算法教科书 我被这个问题难住了 假设我们要计算值 x y 其中 x 和 y 为正数 分别具有 m 和 n 位的整数 解决该问题的一种方法是执行 y 1 乘以 x 你能给出一个仅使用 O n 乘法步骤的更有效的算法吗 这会是一个分
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 比较 C# 中 DateTime 的二进制表示形式

    我有一个DateTime表示为长 8 个字节 来自DateTime ToBinary 我们称之为dateTimeBin 是否有一种最佳方法可以删除时间信息 我只关心日期 以便我可以将其与一天的开始进行比较 假设我们将此样本值作为一天的开始
  • 添加到数组连续数字

    这是我向SO提出的第一个问题 我希望能答对 在 PHP 中 如果你不会 Python 或伪语言也可以 给定一个包含 n 个元素的数组 old array 1 2 3 5 7 8 9 20 21 23 29 我需要向新数组添加连续数字 如果不
  • 两个非嵌套循环的大 O 表示法

    对于两个非嵌套的 for 循环 大 O 表示法是什么 Example for int i 0 i
  • 如何计算两个ip之间的主机数量? C#

    我有两个ip 1 1 1 1 1 2 4 4 4 4 显然这只是一个例子 这是一个动态计算器 如果子网掩码不相关 我如何计算所述 ip 之间的主机数量 要计算 理论 IP 地址的数量 您需要将每个 IP 地址转换为其 32 位整数格式 这实
  • 合并字符数组中的最小重复次数

    假设我有两个数组 我想合并它们 以便合并后的数组具有最小重复次数 例如 x x 是重复 arr1 x d d m f m arr2 d d x f f m 唯一的条件是在合并数组中 元素来自arr1 and arr2必须出现在各自的订单中a
  • 如何从数组表示构建不完全二叉树

    如果输入是一个数组 其中null表示没有节点 input 1 2 3 null 5 null 7 请假设我已经检查过输入 对于每个array i 它的父母array i 2 不会是null 递归地 所以根不能是null 如何构建具有这样的逻
  • 按百分比减少多边形面积

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

    我们希望创建一种评分算法 在更短的时间内获得更高的分数 在更长的时间内获得更少的分数 需要注意的是 没有实际范围 因此时间范围可以从 100 毫秒到长达 10 分钟或更长时间 点范围为 0 到 50 谢谢你的帮助 你可以简单地把它变成一个线
  • 使到 n 个点的集合的欧氏距离之和最小的点

    我有一组点W x1 y1 x2 y2 xn yn 在 2D 平面上 你能找到一种算法 将这些点作为输入并返回一个点 x y 在 2D 平面上 距以下点的距离之和最小W 换句话说 如果 di Euclidean distance x y xi
  • cordova 使用什么 js“引擎”?

    Cordova 使用什么 JS 引擎 它是特定于平台的还是跨所有平台的一个标准 意味着 iOS 的 safari 和 Android 的 chrome 以及 Windows 可能的 IE 标准 或者跨所有平台的 Cordova JS 引擎
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 什么时候使用哈希表?

    什么情况下使用哈希表可以提高性能 什么情况下不能 哪些情况不适合使用哈希表 什么情况下使用哈希表可以提高性能 什么情况下不能 如果您有理由关心 请使用哈希表和您正在考虑的其他任何内容来实现 将您的实际数据放入其中 并衡量哪个性能更好 也就是
  • 使用FFT算法计算

    给定在平面上的点 1 0 2 0 n 0 上发现的一组 n 个粒子电荷载流子 在 i 0 点发现的粒子电荷记为 Qi 作用在粒子上的力由以下公式给出 C is a Coulomb s constant 给出一个算法来计算 Fi 对于总复杂度
  • 在 O(n) 时间内找到 n x n 矩阵中的局部最小值

    所以 这不是我的家庭作业问题 而是取自 coursera 算法和数据结构课程的未评分作业 现已完成 You are given an n by n grid of distinct numbers A number is a local m
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d

随机推荐

  • 什么是二进制空字符?

    我需要创建 sysDesk 日志文件 在此要求中 我应该创建一个 XML 文件 该文件在元素之间的某些位置包含二进制空字符 有人可以向我解释一下 首先什么是二进制空字符 以及如何将其写入文本文件 我怀疑这意味着 Unicode U 0000
  • 应用程序打开时不显示通知

    应用程序运行时不显示通知 当应用程序关闭时它会起作用 MyFirebaseMessagingService java public class MyFirebaseMessagingService extends FirebaseMessa
  • 即使更改别名后,终端也仅运行 2.7

    如何让终端运行像 manage py 这样的脚本 它将使用 python3 而不是 python2 如果我输入 python 它会运行 python3 但此命令会运行 python2 你的第一行manage py应该 usr bin env
  • Node.js 中的活动句柄是什么

    我发现我的应用程序活动句柄数不断增加 活动句柄的数量究竟是多少 这是我必须注意防止应用程序崩溃的事情吗 活动手柄 句柄是对开放资源 例如打开的文件 数据库连接或请求 的引用 为了理解为什么句柄应该处于关闭状态却可能处于活动状态 我给你一个简
  • 可以在 Spark 批处理上创建模型并在 Spark 流中使用它吗?

    我可以在 Spark Ba tch 中创建模型并将其用于 Spark Streaming 进行实时处理吗 我在 Apache Spark 网站上看到了各种示例 其中训练和预测都是基于相同类型的处理 线性回归 构建的 我可以在 Spark B
  • 使用没有 json 文件的 Google 应用程序默认凭据

    我使用 C 创建了一个控制台应用程序 我使用了谷歌云语音API 我跟着this https github com GoogleCloudPlatform dotnet docs samples tree master speech api
  • 在 Atom 中使用多个游标时有没有办法增加数字?

    我发现自己一遍又一遍地这样做 这可能非常耗时 有哪些选项可用于此 The 增量选择 https atom io packages increment selection包可能就是您正在寻找的 它似乎可以使用多个游标 因此应该非常接近您的用例
  • 获取 DataFrame 的日期时间列的工作日/星期几

    我有一个数据框df如下所示 摘录 时间戳 是索引 Timestamp Value 2012 06 01 00 00 00 100 2012 06 01 00 15 00 150 2012 06 01 00 30 00 120 2012 06
  • 如何在recyclerView中设置可见性小部件

    我有谷歌地图和集群数据 当我单击某个集群时 会显示水平回收器视图 我有 imageButton 它是 CardView 中的下一个或上一个按钮 当我单击它时 cardView 会滚动到下一个位置 它工作完美 但我有一个问题 我的第一个 Ca
  • 如何在 data.frame 中引用 data.frame 的列?

    我有一个名为 series to plot df 的 data frame 它是通过将许多其他 data frame 组合在一起创建的 如下所示 我现在只想从每个列中提取 mm 列 以便我可以绘制它们 所以我想拉出每个 data frame
  • 如何root Genymotion Android 模拟器?

    我已经下载了 Genymotion Android Emulator 供个人使用 我在互联网上搜索以root此设备 论坛说通过adb shell它已经root 同意 Sumits MacBook Pro sdk eSumit adb s 1
  • 模拟Python的内置打印功能

    我试过了 from mock import Mock import builtin builtin print Mock 但这会引发语法错误 我也尝试过像这样修补它 patch builtin print def test somethin
  • 如何按因子生成随机治疗变量?

    Define x lt data frame ID letters 1 10 class as factor c rep 1 5 rep 2 5 treat rep 0 10 s t gt x ID class treat 1 a 1 0
  • javascript 使用 index.js 从“/folder”导入

    我注意到在一些案例中我看到过类似以下内容 reducers reducer1 js export default function reducer1 state action etc reducers reducer2 js export
  • 如何将两个ListView放在一列中?

    我有两个带有 ExpansionTile 的 ListView 我想将它们一个接一个地放在一个列中 该列中首先有一些其他小部件 这是我的代码 override Widget build BuildContext context TODO i
  • 爬行 Android 文件系统陷入可能的 SymLink 循环

    我正在尝试在没有 NIO 的情况下抓取 Android 设备的整个文件系统 包括目录和文件 来构建它的树 如果我有 NIO 那么我可以使用 WalkTree 或类似的 但我没有 我遇到的问题 在 Nexus 5 API 23 x86 模拟器
  • Symfony 2.8:从 2.7.7 更新到 2.8.0 后 isScopeActive 弃用

    我已经从 2 7 7 更新到 symfony 2 8 并且我得到了这个弃用 Symfony Component DependencyInjection Container isScopeActive 方法自 2 8 版本起已弃用 并将在 3
  • 在 F# 中重放记录的数据流

    我已将实时股票报价记录在 SQL 数据库中 其中包含字段Id Last and TimeStamp 最后是当前股价 双倍 以及TimeStamp is the DateTime记录价格变化的时间 我想以与传入相同的方式重播此流 这意味着如果
  • 为 Django 模型生成非序列 ID/PK

    我即将开始开发新的网络应用程序 其中一部分将为用户提供可以以一对多关系进行自定义的页面 这些页面自然需要有唯一的 URL 留给自己的设备 Django 通常会分配一个标准AUTOINCREMENT模型的 ID 虽然这效果非常好 但看起来不太
  • 从整数流创建平衡二叉搜索树

    我刚刚结束了一次工作面试 我一直在纠结这个问题 在我看来 在 15 分钟的面试中这是一个很难回答的问题 问题是 编写一个函数 给定整数流 无序 构建平衡搜索树 现在 您不能等待输入结束 它是一个流 因此您需要动态平衡树 我的第一个答案是使用