范围内的第 K 个最小值

2024-03-17

给定一个整数数组和一些查询操作。
查询操作有2种类型
1.将第i个索引的值更新为x。
2.给定 2 个整数,找到该范围内的第 k 个最小值。(例如,如果 2 个整数是 i 和 j ,我们必须找出 i 和 j 之间的第 k 个最小值)。
我可以使用线段树找到范围最小值查询,但无法找到第 k 个最小值。 谁能帮我?


这里有一个O(polylog n)每个查询解决方案实际上并不假设一个常量k, 所以k查询之间可能有所不同。主要思想是使用线段树,其中每个节点代表数组索引的一个区间,并包含所代表的数组线段中的值的多重集(平衡二叉搜索树)。更新操作非常简单:

  1. 从叶子(您正在更新的数组索引)开始沿着线段树向上走。您将遇到表示包含更新索引的数组索引区间的所有节点。在每个节点,从多重集中删除旧值并将新值插入多重集中。复杂:O(log^2 n)
  2. 更新数组本身。

我们注意到每个数组元素都会在O(log n)多重集,因此总空间使用量为O(n log n)。通过多重集的线性时间合并,我们可以构建初始线段树O(n log n)还有(有O(n)每个级别的工作)。

那么查询呢?我们给定一个范围[i, j]和一个等级k并想找到第 k 个最小的元素a[i..j]。我们该怎么做呢?

  1. 使用标准线段树查询过程查找查询范围的不相交覆盖范围。我们得到O(log n)不相交的节点,其多重集的并集恰好是查询范围内的值的多重集。我们称这些多重集为s_1, ..., s_m (with m <= ceil(log_2 n))。寻找s_i takes O(log n) time.
  2. Do a select(k) http://en.wikipedia.org/wiki/Selection_algorithm查询并集s_1, ..., s_m。见下文。

那么选择算法是如何工作的呢?有一种非常简单的算法可以做到这一点。

We have s_1, ..., s_n and k给定并想要找到最小的x in a,使得s_1.rank(x) + ... + s_m.rank(x) >= k - 1, where rank返回小于的元素数量x在相应的 BBST 中(这可以在O(log n)如果我们存储子树大小)。 我们就用二分查找来查找x!我们遍历根的 BBST,进行几次排名查询并检查它们的总和是否大于或等于k。这是一个谓词单调x,所以二分查找有效。那么答案是最小的后继者x在任何一个s_i.

复杂: O(n log n)预处理和O(log^3 n)每个查询。

所以我们总共得到的运行时间为O(n log n + q log^3 n) for q查询。我相信我们可以把它归结为O(q log^2 n)具有更聪明的选择算法。

UPDATE:如果我们正在寻找一种可以一次处理所有查询的离线算法,我们可以得到O((n + q) * log n * log (q + n))使用以下算法:

  • 预处理所有查询,创建数组中曾经出现过的所有值的集合。其数量最多为q + n.
  • 构建一个线段树,但这次不是在数组上,而是在可能值的集合上。
  • 线段树中的每个节点代表一个值区间,并维护一组这些值出现的位置。
  • 要回答查询,请从线段树的根开始。检查根的左子节点中有多少位置位于查询区间内(我们可以通过在位置的 BBST 中进行两次搜索来做到这一点)。令该数字为m. If k <= m,递归到左孩子。否则递归到右孩子,k减少了m.
  • 如需更新,请从O(log (q + n))覆盖旧值的节点并将其插入到覆盖新值的节点中。

这种方法的优点是我们不需要子树大小,因此我们可以使用平衡二叉搜索树的大多数标准库实现来实现它(例如set<int>在 C++ 中)。

我们可以通过将线段树更改为权重平衡树,例如 BB[α] 树 http://www.eli.sdsu.edu/courses/fall95/cs660/notes/BB/BBtrees.html。它与其他平衡二叉搜索树一样具有对数运算,但允许我们在子树变得不平衡时从头开始重建整个子树,方法是将重建成本计入导致不平衡的操作。

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

范围内的第 K 个最小值 的相关文章

  • C# 计算LRC(纵向冗余检查)

    我一直在到处研究这个问题 所有 LRC 实现似乎都没有给我正确的答案 花了几天时间后 我决定将我的代码放在这里 看看其他人是否可以发现问题 这是代码 C Input Data 31303030315E315E31303030325E315E
  • 为什么 .Net 词典中的条目是按加法顺序排列的?

    我刚刚看到这种行为 我对此感到有点惊讶 如果我向字典中添加 3 或 4 个元素 然后执行 For Each 来获取所有键 它们将以我添加的顺序出现 这让我感到惊讶的原因是字典内部应该是一个哈希表 所以我希望事情能以任何顺序出现 按键的哈希排
  • Java:使用indexOf方法根据另一个数组对数组进行排序

    我想根据另一个数组 索引 的排序顺序迭代两个数组 A B 在本例中为 10 34 32 21 String A a b c d String B e f g h int indexes 10 34 32 21 为这里的坏例子道歉 我已经更新
  • 当目标是查找某个字符串的所有出现情况时,KMP 最坏情况的复杂度是多少?

    我还想知道哪种算法在查找另一个字符串中所有出现的字符串时具有最坏情况的复杂性 博耶 摩尔算法似乎具有线性时间复杂度 KMP 算法在查找字符串中所有出现的模式时具有线性复杂度 如 Boyer Moore 算法1 如果您尝试在 aaaaaaaa
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig
  • 稀疏矩阵中的最大和子矩形

    求一个子矩形中的最大和NxN矩阵可以完成O n 3 正如其他帖子中指出的 使用 2 d kadane 算法的时间 然而 如果矩阵是稀疏的 具体来说O n 非零条目 可以O n 3 时间被打败了吗 如果有帮助的话 对于我感兴趣的当前应用程序
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 任何人都知道 JQuery 插件可以生成类似于 geni.com 上的树形菜单

    大家好 我花了几个小时寻找一个 Jquery 插件来生成像 geni com 上那样的树形菜单模块 如果有人知道 Jquery 中的这样的插件或脚本 请让我知道或指导我如何使用 Jquery 开发这样的功能 请检查我正在寻找什么http w
  • 按百分比减少多边形面积

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

    我正在研究 3 Sum 来自己实现它 并遇到了以下规则的实现 给定一个由 n 个整数组成的数组 S S 中是否存在满足 a b c 0 的元素 a b c 查找数组中所有总和为零的唯一三元组 注意 三元组 a b c 中的元素必须按非降序排
  • 如何从二叉搜索树中均匀随机地返回节点?

    给定一个 BST 可能平衡也可能不平衡 如何能够均匀地随机返回 任何 节点 一个限制是您不能使用外部索引数据结构 您必须以每个节点都有平等被访问的机会的方式遍历树 这个问题让我困惑了好一阵子 如果我们确实可以使用外部哈希表 指针 我们可以对
  • 什么时候使用哈希表?

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

    我已经尝试 Scala 一段时间了 并且经常遇到支持不可变数据结构的建议 但是当你有一个像这样的数据结构时3D 场景图 大型神经网络或任何具有大量需要频繁更新的对象的东西 对场景中的对象进行动画处理 训练神经网络 这似乎是 运行时效率极低
  • 从日志文件中获取前 100 个 URL

    我的一位朋友在接受采访时被问到以下问题 谁能告诉我如何解决它 我们有一个相当大的日志文件 大约 5GB 日志文件的每一行都包含一个用户在我们网站上访问过的 URL 我们想要找出用户访问最多的 100 个 URL 怎么做 如果我们有超过 10
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 节点*链表中的下一个

    我是数据结构和算法的新手 我遇到了以下代码 typedef struct node int data node next 谁能告诉我为什么我们要声明节点 next next 不能声明为 int next 吗 因为你希望能够做到n gt ne
  • 使用主方法求解 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
  • 如何从一组重叠的圆计算多边形集?

    这个问题是一些计算细节的扩展这个问题 https stackoverflow com questions 1667310 combined area of overlapping circles 假设有一组 可能重叠的 圆 并且希望计算这组
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据

随机推荐