当前位置:C++技术网 > 资讯 > 数据结构与算法之海量数据的查找

数据结构与算法之海量数据的查找

更新时间:2018-03-25 21:40:30浏览次数:1+次

分析: 首先,我们可以先创建一个大小为K的数据容器来存储最小的K个数字,接下来,每次从输入的数据中读取一个数存入到容器中,当容器还没有满的时候,我们只需要正常的读取就可以,一旦读取的数据数量超过容器的大小,接下来我们就需要在找到打的数字然后剔除就好了。

那么时间复杂度就是从读取,容器内数据的查找,删除,插入两大步骤来算,读取的时间复杂度是n,如果我们使用树结构来做容器,那么容器内的操作时间复杂度就是lg(k), 因此总的时间复杂度就是nlg(k)。要剔除最大的数,我们自然而然想到最大堆。当然我们也可以用红黑树来做,直接就可以使用STL里面的set数据集合。由于是海量的数据,而内存的空间又是有限的,我们需要借助辅助内存来存储数据,可以使用磁盘什么的。大概分析到这里了。
源码:
// ====================方法2====================
typedef multiset<int, std::greater<int> >            intSet;
typedef multiset<int, std::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()))
            {
                leastNumbers.erase(iterGreatest);
                leastNumbers.insert(*iter);
            }
        }
    }
}