Dynamic median

Design a data type that supports insert in logarithmic time, find-the-median in constant time, and remove-the-median in logarithmic time.

public double getMedian(leftset, rightSet, input) { //其中左边集合为比较小的元素集合,右边集合为大的元素集合
        while((item = input.read()) != null) // 可以读取到元素{
            if(item < leftSet.top) { // 如果小于左边集合
                leftSet.insert(item);
            } else {
                rightSet.insert(item);  //将元素加入到右边集合
            }
            // 判断两边元素个数的差异,进行调整
            if(leftSet.size() - rightSet.size() == 2) {  //如果左边元素集合比右边元素集合大2, 取顶元素加入到右边
                  item = leftSet.remove();
                 rightSet.insert(item);
            }
            // 同样应用于右边元素比左边元素大2的情况
            if(rightSet.size() - leftSet.size() == 2) {  //如果右边元素集合比左边元素集合大2, 取顶元素加入到左边
                  item = rightSet.remove();
                  leftSet.insert(item);
            }
        }
        // 在元素取完之后要判断两边集合元素的情况
        if(leftSet.size() == rightSet.size()) {
            return (leftSet.top() + rightSet.top()) / 2;
        } else if(leftSet.size() > rightSet.size()) {
            return leftSet.top();
        } else
            return rightSet.top();
    }

你可能感兴趣的:(Dynamic median)