您将获得一个从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等等时。我想知道是否存在更新中位数的算法,只要您知道:
答案 0 :(得分:2)
我知道有效解决这个问题的两种方法。
第一种算法:
您可以在O(logN)时间内修改此树(插入或删除元素)。
只需执行Select(size / 2)操作即可找到中位数。这是 O(logN)解决方案。
第一个堆将包含第一个大小/ 2个最小元素,并在根中保持最大值。
第二个堆将包含最后一个大小/ 2个最大元素,并在根目录中保持最小值。
现在,您可以在第一个或第二个堆中找到中位数作为根元素。
要执行删除(或插入)操作,您可以从第一个或第二个堆中删除该元素(取决于元素)。
现在,如果size(第一个堆)== size(第二个堆)+ 2,则可以从第一个堆中删除最大值,然后插入第二个堆。
如果size(第一堆)+2 == size(第二堆),则可以从第二个堆中删除最小值并将其插入第一个堆。
所有这些操作都需要O(logN)时间。