Algorithm 从列表中删除图元时更新中间值

Algorithm 从列表中删除图元时更新中间值,algorithm,median,Algorithm,Median,给您一个从1到n(没有重复项)的混合整数列表,例如4,2,6,1,5,3和排序列表1,2,3,4,5,6 现在中位数是3.5。当查看排序后的列表1,2,3,4,5,6时,可以在O(1)时间内计算出该值。现在从混合列表中删除4个。是否有一种算法可以在O(1)时间内更新中值?我想从排序的列表中删除索引4-1=3,然后找到它的中间值 这适用于第一次迭代,但不适用于其他迭代,即删除2、6等等。我想知道的是,如果您知道,是否存在更新中值的算法: 上一中位数 已从列表中删除的整数 迭代次数 我知道两种有效

给您一个从1到n(没有重复项)的混合整数列表,例如4,2,6,1,5,3和排序列表1,2,3,4,5,6

现在中位数是3.5。当查看排序后的列表1,2,3,4,5,6时,可以在O(1)时间内计算出该值。现在从混合列表中删除4个。是否有一种算法可以在O(1)时间内更新中值?我想从排序的列表中删除索引4-1=3,然后找到它的中间值

这适用于第一次迭代,但不适用于其他迭代,即删除2、6等等。我想知道的是,如果您知道,是否存在更新中值的算法:

  • 上一中位数
  • 已从列表中删除的整数
  • 迭代次数

我知道两种有效解决此问题的方法

第一种算法:

  • 使用
  • 您可以在O(logN)时间内修改此树(插入或删除元素)

    只需执行选择(大小/2)操作即可找到中间值。这是 O(logN)溶液

  • 维护两个二进制堆:
  • 第一个堆将包含第一个大小为/2的最小元素,并将最大值保留在根中

    第二个堆将包含最后大小/2个最大的元素,并在根中保持最小值

    现在您可以在第一堆或第二堆中找到作为根元素的中位数

    要执行删除(或插入)操作,可以从第一个或第二个堆中删除元素(取决于元素)

    现在,如果size(first heap)=size(second heap)+2,您可以从第一个堆中删除最大值,并插入到第二个堆中

    如果大小(第一堆)+2==大小(第二堆),则可以从第二堆中删除最小值并将其插入第一堆


    所有这些操作都需要O(logN)时间。

    我知道两种有效解决此问题的方法

    第一种算法:

  • 使用
  • 您可以在O(logN)时间内修改此树(插入或删除元素)

    只需执行选择(大小/2)操作即可找到中间值。这是 O(logN)溶液

  • 维护两个二进制堆:
  • 第一个堆将包含第一个大小为/2的最小元素,并将最大值保留在根中

    第二个堆将包含最后大小/2个最大的元素,并在根中保持最小值

    现在您可以在第一堆或第二堆中找到作为根元素的中位数

    要执行删除(或插入)操作,可以从第一个或第二个堆中删除元素(取决于元素)

    现在,如果size(first heap)=size(second heap)+2,您可以从第一个堆中删除最大值,并插入到第二个堆中

    如果大小(第一堆)+2==大小(第二堆),则可以从第二堆中删除最小值并将其插入第一堆


    所有这些操作都需要O(logN)时间。

    1。您可以在O(N)时间内从列表中删除该元素。2.可以使用二元搜索树,在O(logN)时间内执行插入/删除操作,也可以在O(logN)时间内找到中值)。计算介质是
    O(n)
    ,而不是
    O(1)
    。您必须查看所有元素才能计算中值。中位数只能在
    O(1)
    中计算,如果列表是一行“[x,x+n,x+n*2,…”。@SashaMN:为此,你需要一个平衡的BST。@KarolyHorvath不完全平衡,平衡-太强的假设。@SashaMN:谁说“完全”了?1。您可以在O(N)时间内从列表中删除该元素。2.可以使用二元搜索树,在O(logN)时间内执行插入/删除操作,也可以在O(logN)时间内找到中值)。计算介质是
    O(n)
    ,而不是
    O(1)
    。您必须查看所有元素才能计算中值。中位数只能在
    O(1)
    中计算,如果列表是一行“[x,x+n,x+n*2,…”。@SashaMN:为此,你需要一个平衡的BST。@KarolyHorvath不完全平衡,平衡-太强的假设。@SashaMN:谁说过“完全”呢?