Algorithm 在最大堆中查找元素

Algorithm 在最大堆中查找元素,algorithm,data-structures,max-heap,Algorithm,Data Structures,Max Heap,我有一个MaxPQ堆,它使用数组来存储元素。我可以使用什么算法来查找堆中的给定元素?我当前使用的算法从索引1开始遍历数组,直至添加到堆中的元素数。该算法的复杂度为O(N),是否有复杂度为O(logN)的算法 如果您只有一个表示堆(最小值或最大值)的数组,恐怕找不到最坏情况下的对数算法,因为从树的顶部开始,您通常无法知道要搜索哪个子树。如果你的根是100,它的子代是90和80,并且你正在寻找一个5,你必须(通常)探索这两条路径 现在,如果您保留一个辅助数据结构,围绕该结构跟踪密钥数组中的位置,您就

我有一个MaxPQ堆,它使用数组来存储元素。我可以使用什么算法来查找堆中的给定元素?我当前使用的算法从索引1开始遍历数组,直至添加到堆中的元素数。该算法的复杂度为O(N),是否有复杂度为O(logN)的算法

如果您只有一个表示堆(最小值或最大值)的数组,恐怕找不到最坏情况下的对数算法,因为从树的顶部开始,您通常无法知道要搜索哪个子树。如果你的根是100,它的子代是90和80,并且你正在寻找一个5,你必须(通常)探索这两条路径

现在,如果您保留一个辅助数据结构,围绕该结构跟踪密钥数组中的位置,您就可以进行固定时间查找。我在网站上找到了以下描述

要查找任意元素,它有助于维护一个额外的数组,该数组由节点名索引,并由它们在堆中的位置(指针或索引号)键入。这使得查找任意节点的时间恒定,并且维护数组中的数据只需要为每个冒泡操作执行固定数量的步骤,因此不会更改heapify up或down的渐近时间


同样,只考虑堆,最坏的情况将是线性的,不过如果遍历堆并进行一些修剪,在实践中可能会有一点加速。

如果在每次插入后都删除堆,则根中应该有max/min元素,这取决于堆是否为max/min heapI。我不希望得到max元素。我希望找到一个由用户提供的随机密钥。我有点假设O(logn)不是最好的情况,因为孩子之间的唯一关系是他们比他们的父母小。会有一个平均复杂度为O(logn)的算法吗?如果有,通过谷歌搜索很难找到平均案例复杂度很难衡量。钥匙的常用范围是什么?有界整数?串?您的大多数查询是“已找到”还是“未找到”类型?我怀疑这样的算法不存在,但我无法证明它。关于max heap,我们只能说节点的值大于其子树中的所有值。这对搜索有什么帮助?它可以让你做一些修剪。平均而言,这是否意味着摊销对数时间?我的直觉是否定的,但我们需要一位专家来权衡。@Ray Toal在辅助数据结构中的每一级存储最大的键怎么样。初始搜索以确定级别最多需要O(logn)时间。一旦我们有了级别,就只有有限数量的元素可供搜索。你认为它能给我带来什么吗?我看不出有什么用。知道每个级别上的最大键并不能告诉您要搜索哪个子树。如果存在从0到N的值,并且只有m个节点,并且您不想保留N个大小的数组,那么您不需要保留哈希吗?