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

具有窗口大小和长输入的运行中值

淳于宏伯
2023-03-14

给定一个数据序列(它可能有副本),一个固定大小的移动窗口,在每次迭代时从数据序列的开始移动窗口,使得(1)最老的数据元素被从窗口中移除,并且新的数据元素被推入窗口中(2)在每次移动时找到窗口内数据的中值。

这里窗口大小是7,我们称之为m。m =窗口大小n =序列中元素的数量,它可能是1000或10000

Median for 4, 6, 99, 10, 90, 12, 17,1,21,32  : 12
Median for 6, 99, 10, 90, 12, 17, 1,21,32  : 12
Median for 99, 10, 90, 12, 17, 1, 21,32 : 17
Median for 10, 90, 12, 17, 1, 21, 32 : 17

我每次都是在m个元素的快速排序的帮助下实现这个东西的,(三个元素的中间值作为支点)。但是这需要很多时间。每次需要分类时。我应该实现这里提到的最小和最大堆解决方案

Min-Max堆解决方案中的问题:

当一个新数据被推入窗口时,从其中一个堆中删除最旧的数据,并将新数据与最大和最小堆的顶部进行比较,以决定将数据放入哪个堆。然后,像第一次迭代一样找到中值。

> < li>

如何从堆中找到并删除最旧的数据,我们如何维护它。根据给定的示例,第二次4是最老的元素,第三次6是最老的元素。我们如何将它从堆中移除。

上述问题的后续问题,如何在堆中查找数据元素是一个问题。堆是二叉树,而不是二叉查找树。

任何帮助都将不胜感激。

编辑:我已经有了输入数据,所以没有插入发生。仅适用于固定大小的队列或窗口,不适用于实际输入序列。

谢谢

共有2个答案

谢旻
2023-03-14

对于数据的运行中值(插入和删除都发生的移动窗口),对移动窗口中的元素使用单个二叉查找树而不是最小-最大堆可能更有用。

二叉查找树也是一个顺序统计树,存储在每个节点上根的子树的大小。

这棵树能够在O(log n)中进行插入、删除和中值计算。

在上面给出的示例中,每个操作的时间复杂度为O(log7)。

萧卜霸
2023-03-14

除了堆DS之外,还保存一个指针(或引用)队列,其中队列中的每个元素都指向表示堆中相关条目的节点。

将窗口移动 1 时:

    < li >使旧元素出列 < li >跟随指针,在二进制堆中查找节点。 < li >将“最后一个”节点(最低级别中最右边的元素)与您刚刚找到的节点“切换” < li >删除新的“最后”节点 < li >重新填充 < li >用下一个元素创建二进制堆的新条目 < li >将节点刚添加的指针排队 < li >重新计算中值
 类似资料:
  • 问题内容: 我想启动4个不同的Chrome窗口,以在4种分辨率下运行相同的测试。– 我知道量角器具有一项称为multiCapabilities的功能,并且我知道您可以像这样设置窗口大小: 但是我并没有真正找到将这两种方法结合起来的方法。还是有一种更简单的方法来创建这种行为 问题答案: 我想到的一个非常简单的解决方案是在测试文件中创建一个带有的循环,以使您的测试以不同的分辨率运行4次。 在您的规格开

  • 我有一个流是消费的Flink Kafka消费者将加入另一个流为定义的窗口大小,如Time.milliseconds(10000)。 如何在运行时将窗口大小更改为Time.milliseconds(20000)?

  • 我对JavaFX有问题。当我调整窗口大小时,它会自动调整锚具的大小以适应。此外,帆布的宽度和高度属性也被绑定到锚烷上。因此,如果通过重新调整窗口本身,锚烷变大,画布也会变大。 但是当我把窗户变小,宽度和高度保持不变时,问题就来了。我真的不明白那里的行为。 因此,如果在使窗户更大的宽度和高度是100。然后在把窗口缩小后,它仍然是100。。。除息的 这是我的画布控制器。 以及我对应的FXML:

  • 在CS231n关于卷积神经网络的课程中,在ConvNet中注: > INPUT[32x32x3]将保存图像的原始像素值,在这种情况下是宽32、高32和具有三个颜色通道R、G、B的图像。 CONV层将计算连接到输入中局部区域的神经元的输出,每个神经元在其权重和输入卷中连接到的小区域之间计算一个点积。如果我们决定使用12个过滤器,这可能会导致体积,例如[32x32x12]。 从文档中,我了解到INPU

  • 窗口大小,我们可以非常方便的使用width、height调整,但是如何知道 width和height是一个问题? 在 Window 操作系统中,假如我们想要缩放,我们通常会把鼠标移动到窗口的右边栏,和底部边栏,以及右下边栏。 而且在不同的边栏,鼠标呈现的样式也是不一样的。当我们在右边栏的时候我们可以通过cursor: e-resize;模拟鼠标样式。 在底部边栏我们可以通过cursor: s-re

  • #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = j