在二叉堆中查找特定元素?

Finding a specific element in Binary Heap?

在一个有 100 个元素的二叉堆中,找到第 99 个元素需要多长时间?

或者在 "n" 个元素的二叉堆中,找到第 (n-1) 个元素所花费的时间?

============================================= ============================

我的时间复杂度为 O(1),因为您可以简单地转到数组的第 99 个单元格。

在 n 个元素的二进制最小堆中,第 (n-1)th 个元素(即次大元素)将位于树的最后一层,或堆的倒数第二层。在满堆中,最后一层有 (n+1)/2 项,倒数第二层有 (n+1)/4 项。

这是一个复杂度为 O(n) 的操作,因为您可能需要搜索 (3*(n+1))/4 个元素。

这不是 O(1),因为堆不一定是有序的。您不能保证 100 项堆中的第 99 个最小项位于数组中的第 99 个位置。考虑这两个最小堆:

        1                   1
    2       3           5       2    
  4   5   6   7       6   7   3   4

这两个都是有效的最小堆,但在第二个中,第二小的项在数组中的位置 3。

更新

实际上,在完整的二进制堆中,倒数第二个项目必须在叶级别上。在一个未满的堆中,它可以在叶级、本级或上级的任何位置。考虑一下,例如:

      1
   2     6            
  3 5   7

关于第(3*(n+1)/2)题:

倒数第二个可以是最后一层(4 个节点)或倒数第二层(2 个节点)的任何位置。总共 6 个可能的节点。最后一层的 (7+1)/2 个节点,倒数第二层的 (7+1)/4 个节点。简化,即 (3*(7+1))/4.