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

Python:使用Max-Heap和Min-Heap查找运行中值

茹正初
2023-03-14

我试图返回一系列流媒体数据的运行中值。为此,我使用了一个最大堆(它存储序列下半部分的值)和一个最小堆(它保存序列上半部分的数值)。

特别是,我使用的是来自heapq模块的Python(2.0)内置最小堆数据结构(https://docs.python.org/2/library/heapq.html). 相反,为了构建最大堆,我只需使用需要推入堆中的数字的负数。

我的Python代码如下:

import heapq

maxh = []
minh = []
vals=[1,2,3,4,5,6,7,8,9,10]
for val in vals:

    # Initialize the data-structure and insert/push the 1st streaming value
    if not maxh and not minh:
        heapq.heappush(maxh,-val)
        print float(val)
    elif maxh:

        # Insert/push the other streaming values
        if val>-maxh[0]:
            heapq.heappush(minh,val)
        elif val<-maxh[0]:
            heapq.heappush(maxh,-val)

        # Calculate the median
        if len(maxh)==len(minh):
            print float(-maxh[0]+minh[0])/2
        elif len(maxh)==len(minh)+1:
            print float(-maxh[0])
        elif len(minh)==len(maxh)+1:
            print float(minh[0])

        # If min-heap and max-heap grow unbalanced we rebalance them by
        # removing/popping one element from a heap and inserting/pushing
        # it into the other heap, then we calculate the median
        elif len(minh)==len(maxh)+2:
            heapq.heappush(maxh,-heapq.heappop(minh))
            print float(-maxh[0]+minh[0])/2
        elif len(maxh)==len(minh)+2:
            heapq.heappush(minh,-heapq.heappop(maxh))
            print float(-maxh[0]+minh[0])/2

下面是我为检查代码而构建的测试用例的完整列表:

vals=[1,2,3,4,5,6,7,8,9,10] # positive numbers, increasing series
vals=[10,9,8,7,6,5,4,3,2,1] # positive numbers, decreasing series
vals=[10,9,11,8,12,7,13,6,14,5] # positive numbers, jumping series (keeping
                                # heaps balanced)

vals=[-10,-9,-8,-7,-6,-5,-4,-3,-2,-1] # negative numbers, increasing series
vals=[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10] # negative numbers, decreasing series
vals=[-10,-9,-11,-8,-12,-7,-13,-6,-14,-5] # negative numbers
                                          # jumping series (keeping heaps
                                          # balanced)

vals=[-5,-4,-3,-2,-1,0,1,2,3,4,5] # mixed positive-negative numbers,
                                  # increasing series
vals=[5,4,3,2,1,0,-1,-2,-3,-4,-5] # mixed positive-negative numbers,
                                  # decreasing series
vals=[0,-1,1,-2,2,-3,3,-4,4,-5,5] # mixed positive-negative numbers,
                                  # jumping series (keeping heaps balanced)

我的代码对我来说似乎还可以,但是我无法通过10个测试案例中的4个(https://www . hacker rank . com/challenges/ctci-find-the-running-median/problem)。

你有什么提示吗?

共有1个答案

应子真
2023-03-14

问题就在这里:

    # Insert/push the other streaming values
    if val>-maxh[0]:
        heapq.heappush(minh,val)
    elif val<-maxh[0]:
        heapq.heappush(maxh,-val)

如果 val == maxh[0],则该项永远不会被推送到任一堆上。您应该能够使用测试用例 [1,1,2] 显示错误。

一个简单的解决方法是:

    # Insert/push the other streaming values
    if val >= -maxh[0]:
        heapq.heappush(minh,val)
    else
        heapq.heappush(maxh,-val)
 类似资料:
  • 本文向大家介绍Java Max Heap(堆),包括了Java Max Heap(堆)的使用技巧和注意事项,需要的朋友参考一下 最大堆是一个完整的二叉树,其中,每个步骤中根节点的值都大于或等于子节点中的值。 以下是使用库函数实现的Max Heap。 示例 输出结果 名为Demo的类,在主函数中,定义了优先级队列的实例,并使用“add”函数将元素添加到其中。定义了一个迭代器 用于迭代优先级队列中的元

  • 我正在开发一个程序,通过将数组划分为较小的最大堆并从每个堆中提取最大整数,然后将其从堆中删除并再次运行,直到每个堆都为空,来对数组进行排序,但我似乎无法理解。 从我的立场来看,代码看起来不错,但我没有得到我想要的结果。我的输入是随机创建的,并生成512个整数的数组。下面是它为一个示例运行打印的内容- 有人能发现我的代码有什么问题吗?我会非常高兴的。 (1) 主程序 (2) 最大堆类 (3)输入创建

  • 堆是平衡二叉树数据结构的特例,其中根节点密钥与其子节点进行比较并相应地进行排列。 如果α有子节点β那么 - 键(α)≥键(β) 由于parent的值大于child的值,因此该属性会生成Max Heap 。 基于此标准,堆可以有两种类型 - For Input → 35 33 42 10 14 19 27 44 26 31 Min-Heap - 根节点的值小于或等于其子节点的值。 Max-Heap

  • import "container/heap" heap包提供了对任意类型(实现了heap.Interface接口)的堆操作。(最小)堆是具有“每个节点都是以其为根的子树中最小值”属性的树。 树的最小元素为其根元素,索引0的位置。 heap是常用的实现优先队列的方法。要创建一个优先队列,实现一个具有使用(负的)优先级作为比较的依据的Less方法的Heap接口,如此一来可用Push添加项目而用Pop

  • 一般情况下,堆通常指的是二叉堆,二叉堆是一个近似完全二叉树的数据结构,但由于对二叉树平衡及插入/删除操作较为麻烦,二叉堆实际上使用数组来实现。即物理结构为数组,逻辑结构为完全二叉树。子结点的键值或索引总是小于(或者大于)它的父节点,且每个节点的左右子树又是一个二叉堆(大根堆或者小根堆)。根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常被用作实现优先队列。 特点 以数组表示,但

  • 我知道堆排序中BUILD-MAX-HEAP的运行时间是O(n)。但是,如果我们有一个已经按降序排序的数组,为什么对于BUILD-MAX-HEAP的运行时间仍然有O(n)<它不是应该是类似于O(1)的吗?它已经从最大值到最小值排序,因此我们不需要MAX-HEAPIFY。 我的理解正确吗?谁能给我解释一下吗?