当前位置: 首页 > 知识库问答 >
问题:

仅使用堆从任意整数数组中查找中值

相旭
2023-03-14

我需要找到给定数组的中位数,并限制只能使用堆。

我知道用于查找中位数的线性选择算法。以下方法(仅基于堆)是否正确?

  1. 从给定数组构建一个max-heap(h
  2. 从堆h
  3. 的叶子( ceil(n/2))构建一个max-heap( h1
  4. 从堆h
  5. 的内部节点( 楼层(n/2))构建一个min-heap( h2
  6. 如果n是奇数返回max(h1[0], h2[0])
    否则返回(h1[0]h2[0])/2

共有1个答案

巫马越彬
2023-03-14

不,你提出的算法一般不会起作用。它错误地假设max堆的叶子不能有一个大于中位数的值。这不是真的。这里有一个反例:

输入:[7,6,3,5,4,2,1]

  1. 从给定数组构建max-heap(h

输入碰巧已经被构造为最大堆。它是:

                     7
                   /   \  
                 6       3
                / \     / \
               5   4   2   1
              
                 5     
                / \
               4   2
              /
             1
                 3
                / \
               7   6

请注意,在这一步和前一步中,创建这些较小的堆对您的目的来说并不是真正必要的,因为您实际上只对从叶子中获取最大值和从内部节点中获取最小值感兴趣。为此,简单的扫描就足够了,而无需实际创建另外两个堆。

 max(h1[0],h2[0]) = 5

然而正确答案不是5,而是4。

您只需要一个堆。

将值的前半部分(向上舍入)放入最小值堆中。然后,对于其余值,检查每个值是否小于堆的根。如果是这样,请忽略该值。如果不是,则将根的值替换为较大的值,并堆化堆,以便新值筛选到堆中的好位置。

完成此操作后,您知道所有大于中位数的值都在树中,并且它还包括表示中位数的一个或两个值。如果输入的值为奇数,则根是中位数。如果它是偶数,则从堆中提取根值,并将其与此提取后成为根的值相平均。

 类似资料:
  • 本文向大家介绍使用PHP从给定的整数中查找月份,包括了使用PHP从给定的整数中查找月份的使用技巧和注意事项,需要的朋友参考一下 如果您需要从给定的整数(1到12)中了解月份,则可以使用以下代码段。这将返回字符串“ Feb”。 date("M", mktime(0, 0, 0, 2)); 可以将其封装到一个函数调用中,该函数调用将采用1到12之间的数字,并返回该月的相应字符串。此功能包括一些简单的错

  • @PeterLawrey我稍微调整了代码如下,因为我只需要洗牌,这是一个享受,我会弹出卡片的堆栈来处理 感谢彼得和所有其他贡献者。M.

  • 问题内容: 我们需要在分配中递归地找到一个数组中的第二个最小整数。但是,为了更好地理解该主题,我想先通过本网站进行迭代,然后自己进行递归。 不幸的是,迭代地进行相当混乱。我知道该解决方案很简单,但我无法解决。 到目前为止,以下是我的代码: 这适用于一些数字,但不是全部。数字会变化,因为内部if条件的效率不如外部if条件的效率。 禁止阵列重排。 问题答案: 试试这个。当最小的数字是第一个时,第二个条

  • 问题内容: 改写: 在我的项目中,我有图像。每个图像有5个标签,范围为[1,10]。我用Elasticsearch上传了这些标签: 我将这些文件加载​​到类型为“ img”的索引“ my_project”中的elasticsearch中: 我上传的其他示例文件: 在我的应用程序中,向量要长得多,但是具有固定数量的唯一元素。我喜欢这些文件中的20M。 现在,我想找到给定向量的相似文档。向量具有更多公

  • 找到给定n个数字集的中位数的一种方法是将它们分布在2堆中。1是一个包含较低n/2(ceil(n/2))数字的max-heap和一个包含其余数字的min-heap。如果以这种方式保持,中位数是第一堆的最大值(如果n是偶数,则第二堆的最小值)。这是我的c代码: 我们知道堆化操作具有线性复杂性。这是否意味着如果我们像上面的代码一样将数字一个接一个地插入两个堆中,我们就会找到线性时间的中位数?

  • 我是Python的新手 我想在pandas数据帧中找到某个值的索引(比如说),因为这是列的起始位置。(列上方的行数未知,数据不相关,左侧的“列”为空。) 据我所知,isin方法只返回值是否存在的布尔值,而不是其索引。 如何找到该值的索引?