以下為“找最小k個數”中的一段代碼,它使用了 multiset 容器,基於紅黑樹實現,
而這段算法的思想是 最大堆的思想,下面算法中 leastNumbers.begin() 應是指向最大值,這是為什麼?
紅黑樹應是一顆二叉搜索樹,為什麼能保證 leastNumbers.begin() 指向最大值?
typedef multiset<int, greater<int> > intSet;
typedef multiset<int, greater<int> >::iterator setIterator;
void GetLeastNumbers_Solution2(const vector<int>& data, intSet& leastNumbers, int k)
{
leastNumbers.clear();
if(k < 1 || data.size() < k)
return;
vector<int>::const_iterator iter = data.begin();
for(; iter != data.end(); ++ iter)
{
if((leastNumbers.size()) < k)
leastNumbers.insert(*iter);
else
{
setIterator iterGreatest = leastNumbers.begin();
if(*iter < *(leastNumbers.begin())) // 為什麼這裡 begin() 指向最大值?
{
leastNumbers.erase(iterGreatest);
leastNumbers.insert(*iter);
}
}
}
}
typedef multiset > intSet;
intSet設置了greater,插入的數據都是降序排序的。最大值為第一個