algorithm - 在 O(n) 中创建二叉树
问题描述
我有一个带有 n 个数字的序列,我想创建一个数据结构来回答以下问题:n = [5 ,7, 4, 24, 8, 3, 12, 34]
我想要的序列min(2,5)
然后答案是 3,因为a2=7, a3=4, a4=24, a5=8
. 所以 min(i,j) 返回 (i,j) 之间最小数的位置。我认为保存这个序列的一个好的数据结构是一个完整的二叉树来保存叶子的序列号。但是我怎样才能在 O(n) 中实现这个结构呢?
解决方案
您只需要一个具有范围最小查询的段树。这是它的详细解释。构建时间为O(n)
,因为树中的节点数不超过2 * n
,所以最终的时间复杂度为O(n)
。
如果您不仅需要找到最小值,还需要找到位置,那么在顶点内部,您不仅需要存储最小值,还需要存储达到的位置。如何更新这样的结构似乎很清楚:当你重新计算父亲中的最小值时,你需要查看它是从哪个儿子接收的,并从儿子那里取最小值的对应位置。对于叶子,位置等于叶子本身的位置。
推荐阅读
- sql - Invoke-Sqlcmd:无效的对象名称“Inventar”
- vb.net - 如何使用计时器在特定时间段后自动删除文本文件
- php - 如何处理 laravel 资源中的嵌套关系
- excel - 为什么我的 VBA PasteSpecial, Operation:= xlAdd 将单元格值加倍?
- printf - Windbg .printf 字符串别名来自 as /c
- php - 用于文件上传/直接输入的 W3 Validator Api
- powershell - 编辑 ADPropertyValueCollection (IList)
- variables - 循环内的脚本。第二次执行时出错
- conv-neural-network - 使用 tiny-imagenet-200 数据训练模型 (resnet18/densenet) 时,Google colab 不断崩溃
- php - Symfony 4 测试中 Twig 中的会话始终为空