从列表中删除元素时更新中值

时间:2016-01-24 21:49:15

标签: 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 个答案:

答案 0 :(得分:2)

我知道有效解决这个问题的两种方法。

第一种算法:

  1. 使用https://en.wikipedia.org/wiki/Order_statistic_tree
  2. 您可以在O(logN)时间内修改此树(插入或删除元素)。

    只需执行Select(size / 2)操作即可找到中位数。这是     O(logN)解决方案。

    1. 维护两个二进制堆:https://en.wikipedia.org/wiki/Binary_heap
    2. 第一个堆将包含第一个大小/ 2个最小元素,并在根中保持最大值。

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

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

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

      现在,如果size(第一个堆)== size(第二个堆)+ 2,则可以从第一个堆中删除最大值,然后插入第二个堆。

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

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