我有一个二进制最大堆(顶部的最大元素),我需要通过每次达到 20 个元素时去掉最小的元素来保持它的大小不变(比如 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)。那是对的吗?