查找存储为 Ahnentafel 数组的二进制最大堆的最小元素

2024-04-04

我有一个二进制最大堆(顶部的最大元素),我需要通过摆脱smallest每次我达到 20 个元素时。二叉堆存储在一个数组中,节点 i 的子节点为 2*i 和 2*i+1(i 从零开始)。在任何时候,堆都有 'n_elements' 个元素,介于 0 和 20 之间。例如,数组 [16,14,10,8,7,9,3,2,4] 将是一个有效的最大二元堆,其中16 人有 14 岁和 10 岁的孩子,14 人有 8 岁和 7 岁的孩子......

为了找到最小的元素,似乎通常我必须从 n_elements/2 到 n_elements 遍历数组:最小的元素不一定是数组中的最后一个。

因此,仅使用该数组,似乎任何查找/删除最小 elt 的尝试都至少是 O(n)。那是对的吗?


对于任何给定的有效最大堆,最小值仅位于叶节点处。下一个问题是如何在数组中找到堆的叶子节点?如果我们仔细观察数组的最后一个节点,它将是最后一个叶节点。通过公式获取叶子节点的父节点

parent node index = (leaf Node Index)/2

从索引开始线性搜索(parent node index +1)到最后一个叶节点索引获取该范围内的最小值。

FindMinInMaxHeap(Heap heap)
   startIndex = heap->Array[heap->lastIndex/2]
   if startIndex == 0
          return heap->Array[startIndex]
   Minimum = heap->Array[startIndex + 1]
   for count from startIndex+2 to heap->lastIndex
            if(heap->Array[count] < Minimum)
                Minimum := heap->Array[count]
   print Minimum
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找存储为 Ahnentafel 数组的二进制最大堆的最小元素 的相关文章

  • java数据结构模拟数据树

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

    假设我有一个无序集合 s 3 6 5 1 2 4 并且我需要构造一个 AVL 树 就这么多了 我了解基本的旋转 我在这里达到这一点 5 2 6 1 3 但当我尝试插入 4 时 一切都崩溃了 我得到的最终答案是 左边的 4 But the a
  • Delphi 5 的哈希表实现 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您知道 Delphi 5 的良好且免费的哈希表实现吗 我需要在哈希表中组织大量数据 并且我有点担心在网
  • 树的递归和非递归过程

    我们知道树是递归数据结构 我们在编写树的过程中使用递归 例如BST的删除方法等 递归的好处是 我们的程序变得非常小 例如中序遍历的代码只有4或5行 而不是非递归程序 虽然会很长 但从理解的角度来看 不像递归程序那么复杂 这就是为什么我讨厌递
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http
  • 应用对数来导航树

    我曾经知道一种使用对数从树的一片叶子移动到树的下一个 有序 叶子的方法 我认为它涉及获取 当前 叶子的位置值 排名 并将其用作从根向下到新目标叶子的新遍历的种子 一直使用对数函数测试来确定是否沿着右或左节点向下到达叶子 我已经不记得如何运用
  • SQL 中的链表

    在 MySQL 数据库中存储链接列表的最佳方法是什么 这样插入就很简单 即 您不必每次都重新索引一堆内容 并且可以轻松地按顺序拉出列表 使用 Adrian 的解决方案 但不是增加 1 而是增加 10 甚至 100 然后可以按照要插入的内容之
  • Java:避免在数组列表中插入重复项

    我是java新手 我有一个ArrayList我想避免插入时重复 我的ArrayList is ArrayList
  • python数据结构(类似设置)在添加重复项时抛出异常

    我正在寻找一种在添加重复元素时会引发异常的数据结构 我发现的最接近的是collections Counter gt gt gt from collections import Counter as counter gt gt gt c co
  • 将列表映射到霍夫曼树,同时保留相对顺序

    我在霍夫曼树上的搜索算法方面遇到问题 对于给定的概率分布 无论输入数据的排列如何 我都需要霍夫曼树相同 这是发生的情况与我想要的情况的图片 基本上我想知道是否可以保留列表中项目与树的相对顺序 如果不是 为什么会这样 作为参考 我使用霍夫曼树
  • 给定一个零索引数组 & 该数组的平衡索引[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 给出一个由 N 个整数组成的零索引数组 A 该数组的平衡索引是任何整数 P 满足 0 P 例如 考虑以下由 N 8 个元素组成的数组
  • Go的堆接口实现的优先级队列的大小限制

    在Java中 有一个具有大小属性 的PriorityQueue 我在这里也期待同样的事情 如果我没记错的话 用例 一一读取数百万数据并将其发送到优先级队列 我只想要前 5 个计算元素 因此我只想要大小为 5 的堆 优先级队列 我正在尝试使用
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 动态前缀和

    是否有任何数据结构能够返回数组的前缀和 1 更新元素以及向数组插入 删除元素 所有这些都在 O log n 内 1 前缀和 是从第一个元素到给定索引的所有元素的总和 例如 给定非负整数数组8 1 10 7前三个元素的前缀和是19 8 1 1
  • 从 Linq 的列表中选择多个字段

    在 ASP NET C 中 我有一个结构 public struct Data public int item1 public int item2 public int category id public string category
  • 没有数组的 MinMax Heap 实现

    我发现了很多 MinMax Heap 实现 它们将数据存储在数组中 它真的很容易实现 这就是我正在寻找不同的东西的方式 我想仅使用堆的元素以及指向左孩子和右孩子的指针 当然还有一个要比较的键 来创建一个 MinMax 堆 因此 堆只有指向根
  • 我的程序替换了链表中所有节点中的所有字符串数据类型

    我有一个程序 基本上将历史记录 节点 添加到员工记录 链接列表 中 这是我的代码 include
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • Java:数组和向量

    我习惯于使用 PHP 但最近我一直在使用 Java 并且试图解决这个问题让我很头疼 我想用 Java 保存这个表示 Array col name 1 gt Array 1 gt col value 1 2 gt col value 2 n
  • 良好的类似 STL 的 C 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 对于具有向量 双端队列 堆栈 哈希图 树形图 集合等数据结构的 C 语言来说 有哪些好的库 请使用纯 C 并且与平台无关 The Glib

随机推荐