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

获取O(对数n)时间内平均值的数据结构

孔光赫
2023-03-14

我需要设计一个数据结构的想法,它可以在
O(logn)时间内插入、删除和获取平均值(a,b)。getmean(a,b)是[a,b]中所有数字x的算术平均值

我的想法-
一般来说,如果我们将数据存储在像AVL树这样的平衡搜索树中,插入和删除操作可以在O(logn)时间内完成。但是为了在O(logn)时间内求解getmean(a,b),我们需要存储一些额外的信息。为了计算平均值,我们可以做以下操作:
递归地进行深入遍历。如果当前元素

共有1个答案

卫志泽
2023-03-14

让树中的每个节点存储它下面元素的计数和和。

然后,您可以以对数(n)步数计算任何范围的计数和总和。从中你可以计算出平均值。

在一个范围内计算这些统计数据的诀窍是,如果我在一个我知道完全在我的范围内的节点上,那么我可以查看它的统计数据,而不必访问该范围。这意味着我只需要探索范围的边缘。假设是一棵树,这里是未经测试的Python,您可以将其视为伪代码。

def find_min (node):
    if node.left is not None:
        return find_min(node.left)
    else:
        return node.value

def find_max (node):
    if node.right is not None:
        return find_min(node.right)
    else:
        return node.value

def find_count_sum_range(node, start, end, lower=None, upper=None):
    # Calculate bounds if not found.
    if lower is None:
        lower = find_min(node)

    if upper is None:
        upper = find_min(node)

    # Shortcut if this node is entirely in the range.
    if start <= lower and upper < end:
        return (node.count, node.sum)

    # Initialize
    count_left = sum_left = 0
    count_this = sum_this = 0
    count_right = sum_right = 0

    # Do we find range to the left?
    if start <= node.value and node.left is not None:
        (count_left, sum_left) = find_count_sum_range(
            node.left, start, end, lower, node.value)

    # Do we find range to the right?
    if node.value < end and node.right is not None:
        (count_left, sum_left) = find_count_sum_range(
            node.left, start, end, node.value, upper)

    # Is this node in range?
    if start <= node.value and node.value < end:
        (count_this, sum_this) = (1, node.value)

    # Add up our answer
    return (
        count_left + count_this + count_right,
        sum_left + sum_this + sum_right
    )

我个人会发现使用跳过列表比使用AVL树更容易实现,但那是因为我很懒,不想仔细考虑树操作。但即使在那里,技巧仍然是一样的——只要你能读出一个范围的计数和总和,就不要访问该范围内的节点。

 类似资料:
  • 问题内容: 我正在尝试学习SQL,所以请耐心等待。我正在使用PostgreSQL 9.3 我想根据日期窗口对一列进行平均。我能够编写窗口函数来完成一个集合,但是我希望能够随着不断增长做到这一点。我的意思是: 我假设有一个比对我要平均的每个范围运行查询更好的方法。任何建议表示赞赏。谢谢你。 编辑 我正在尝试创建均匀分布的垃圾箱,以用于汇总表的值。 我的间隔是: 这里是一个表的列 并且 是并列我想表分

  • 问题内容: 我无法获得熊猫列的平均值或均值。有一个数据框。我在下面尝试的任何事情都没有给我该列的平均值 以下返回几个值,而不是一个: 这样: 问题答案: 如果您只想要列的均值,请选择列(这是一个系列),然后调用:

  • 问题内容: 我有一个numpy的数组。我想创建一个新数组,该数组是每个连续三元组元素的平均值。因此,新数组将是原始数组大小的三分之一。 举个例子: 应该返回数组: 有人可以建议一种有效的方法吗?我在画空白。 问题答案: 如果数组的长度可被3整除: 重塑为高维数组,然后对附加维之一执行某种形式的归约运算是numpy编程的主要内容。

  • 我正在为课堂做一个程序。到目前为止,我已经完成了1-3个,但我不知道如何实现4和5个。我已经被困在这上面一段时间了。必须使用两个类。 null 其他类

  • 问题内容: 我正在生成许多具有相同形状的数据框,并且我想将它们相互比较。我希望能够获得整个数据框的均值和中位数。 然后,我想获得这两个数据帧的均值。 最简单的方法是什么? 为了澄清一下,当所有数据框的索引和列完全相同时,我想获取每个特定单元的平均值。 因此,在我给出的示例中,平均值为(0.001182 + 0.000001)/ 2 = 0.0005915。 问题答案: 假设两个数据框具有相同的列,

  • 问题内容: 我有一个java.util.Date对象数组。我试图找到平均值。 例如,如果我有2个日期对象,分别是7:40 AM和7:50 AM。我应该获得7:45 AM的平均日期对象。 我正在考虑的方法效率低下: 用于遍历所有日期 找出0000与时间之间的时差 将时间差加到总计 除以总数 将该时间转换为日期对象 有更简单的功能可以做到这一点吗? 问题答案: 好的,从根本上讲,您可以将所有对象的“自