从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法

2024-06-19

我们有一个 n 节点二叉堆,其中包含n不同的项目(根部的最小项目)。为一个k<=n, 发现O(klogk)时间算法选择kth堆中的最小元素。

O(klogn)很明显,但无法找出O(klogk)一。也许我们可以使用第二个堆,但不确定。


好吧,你的直觉是正确的,我们需要额外的数据结构来实现 O(klogk),因为如果我们只是在原始堆上执行操作,则 logn 项将保留在最终的复杂度中。

从目标复杂度 O(klogk) 猜测,我想创建并维护一个大小为 k 的堆来帮助我实现目标。您可能知道,以自上而下的方式构建大小为 k 的堆需要 O(klogk),这确实让我想起了我们的目标。

以下是我尝试达到 O(klogk) 的尝试(不一定优雅或高效):

  1. 我们创建一个新的最小堆,并将其根初始化为原始堆的根。

  2. 我们通过删除当前根并将当前根的两个子代插入到原始堆中来更新新的最小堆。我们重复这个过程 k 次。

  3. 生成的堆将由 k 个节点组成,其根是原始堆中第 k 个最小的元素。

注意:新堆中的节点应该存储原始堆中对应节点的索引,而不是节点值本身。在步骤 2 的每次迭代中,我们实际上将一个又一个节点的网络添加到新堆中(一个删除,两个插入),其中 k 次迭代将产生大小为 k 的新堆。第i次迭代时,要删除的节点是原堆中第i个最小的元素。

时间复杂度:在每次迭代中,从新堆中删除一个元素并向新堆中插入两个元素需要 O(3logk) 时间。经过 k 次迭代后,O(3klogk) = O(klogk)。

希望这个解决方案对您有所启发。

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

从二叉堆中查找第 k 个最小元素的 O(klogk) 时间算法 的相关文章

  • 凸包中最大的三角形

    这个问题已经得到解答 但我面临的主要问题是理解答案之一 From https stackoverflow com a 1621913 2673063 https stackoverflow com a 1621913 2673063 下面的
  • 找到三角测量时覆盖另一个点的最近 3 个点的算法

    想象一张画布 周围随机分布着一堆点 现在选择其中一点 您如何找到距离它最近的 3 个点 这样如果您画一个连接这些点的三角形 它将覆盖所选点 澄清 我所说的 最近 是指到该点的最小距离总和 这主要是出于好奇 我认为 如果一个点未知 但周围的点
  • 用于将分层平面数据(带 ParentID)转换为带缩进级别的排序平面列表的算法

    我有以下结构 MyClass guid ID guid ParentID string Name 我想创建一个数组 其中包含按层次结构中应显示的顺序排列的元素 例如 根据它们的 左 值 以及将 guid 映射到缩进级别的散列 例如 ID N
  • 两个未排序小数组的交集算法

    我正在寻找一种在非常特定的条件下对两个小型未排序数组进行交集的算法 数组项的类型只是整数或类整数类型 在相当长的时间内 大约 30 40 一个或两个数组可能为空 数组通常非常小 通常为 1 3 个项目 我预计不会超过 10 个 交集函数会被
  • 从 2 个平面轮廓进行表面重建 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有一类用于两个平面轮廓之间的三角测量的算法 这些算法尝试进行 良好的三角测量 来填充这些轮廓之间的空间 其中之一 基于动态规划技术 并使用成本函
  • 查找top-k元素的平均时间复杂度

    考虑在一组 N 个独立且同分布的浮点值中查找前 k 个元素的任务 通过使用优先级队列 堆 我们可以对所有 N 个元素进行一次迭代 并通过以下操作维护一个 top k 集合 如果元素 x 比堆头 更差 丢弃 x 复杂度 O 1 如果元素 x
  • 需要创建一个“选择你自己的冒险”类型的指南 - 最佳使用方法

    基本上需要询问用户一系列问题并收集信息 每个问题都可能对以后的不同问题产生影响 另一个例子是涡轮税的网络界面 在某些 上回答 是 可能会引发未来的问题 似乎这在软件中是一个相当常见的问题 所以我想我是在问是否有任何现有的解决方案 设计模式可
  • 将 0 更改为 1 或反之亦然的最优雅的方式

    做接下来的事情最优雅的方式是什么 int i oneOrZero if i 0 i 1 else i 0 你可以假设i只能有 1 或 0 值 i 1 XOR https en wikipedia org wiki Exclusive or值
  • Java内存中类似SQL表的数据结构

    有几次我想要一个类似于 SQL 表的数据结构 您可以在其中选择各个字段和多个字段 与内存中的 SQL 实现类似 只是我不想在数据结构中存储那么多对象 我还要求该对象可以通过标准 Java 方式进行序列化 我之前曾使用多个哈希表或自定义哈希键
  • 按字母/字典顺序排列的两个字符串的平均值

    假设您采用字符串 a 和 z 并按字母顺序列出它们之间的所有字符串 a b c x y z 取这个列表的中点 你就会找到 m 所以这有点像取这两个字符串的平均值 您可以将其扩展到具有多个字符的字符串 例如 aa 和 zz 之间的中点将位于列
  • 滑动窗口最小算法

    这是一个家庭作业问题 设 A 是一个整数数组和整数 K 窗口大小 当窗口滑过 A 时 生成在窗口中看到的最小值的数组 M 我发现一篇文章 http home tiac net cri 2001 slidingmin html有这个问题的解决
  • Tarjan 算法的非递归版本

    我有以下 Tarjan 算法的 递归 实现来查找图中的强连接组件 并且工作正常 public class StronglyConnectedComponents public static List
  • Python 中聚类相似字符串的算法?

    我正在编写一个脚本 该脚本当前包含多个 DNA 序列列表 每个列表都有不同数量的 DNA 序列 并且我需要根据汉明距离相似性对每个列表中的序列进行聚类 我当前的实现 目前非常粗糙 提取列表中的第一个序列并计算每个后续序列的汉明距离 如果它在
  • 验证是否存在唯一字符串的组合

    class Details String name String age String email String location 1 如果有详细信息列表 如下所示List
  • 是最小堆函数

    我想编写一个函数来告诉我给定的列表是否是最小堆 到目前为止我所写的内容 def is min heap L return is min heap L 0 def is min heap L i if base case else retur
  • 拓扑排序卡恩算法 BFS 或 DFS

    拓扑排序的方法是BFS还是DFS 哪个正确 我认为BFS是对的 但有些网站说DFS 有些网站说BFS 我很困惑 卡恩算法与 BFS 或 DFS 相同吗 或者BFS 或DFS 只是卡恩算法的工具 Kahn算法和DFS在实践中都用于拓扑排序 选
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • 快速计算幂(例如 2^11)[重复]

    这个问题在这里已经有答案了 可能的重复 实现基于整数的幂函数 pow int int 的最有效方法 https stackoverflow com questions 101439 the most efficient way to imp
  • 高效找到圆和网格的交点

    找到由圆心和半径定义的圆与任意网格的交点的好方法是什么 An illustration of the points I am trying to find 到目前为止我想到的可能的解决方案 找到位于中心 半径之间的所有线 对于每条线计算交点
  • 将 diff 转换为带有删除线的 Markdown?

    我想转换输出diff 在 Markdown 文件上 降价与

随机推荐