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); //將元素加入到右邊集合
}
// 判斷兩邊元素個(gè)數(shù)的差異,進(jìn)行調(diào)整
if(leftSet.size() - rightSet.size() == 2) { //如果左邊元素集合比右邊元素集合大2, 取頂元素加入到右邊
item = leftSet.remove();
rightSet.insert(item);
}
// 同樣應(yīng)用于右邊元素比左邊元素大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();
}