首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么从1G数据中找出最大的1000个

2012-02-19 
如何从1G数据中找出最大的1000个?1G数据,浮点数,怎样快速查找出最大的1000个数?内存足够大。忘高手解答。[解

如何从1G数据中找出最大的1000个?
1G数据,浮点数,怎样快速查找出最大的1000个数?内存足够大。
忘高手解答。


[解决办法]

定义一个1000大小的数组 a,

遍历这1G数据

逐个把数据放到 a 中, (a 中的数据从大到小排列) 把小的数据挤出




[解决办法]
先从大到小排序,再取出前面1000个就可以了。不要搞那么复杂,排个序又不复杂,况且有现成的函数可用。
[解决办法]
全部排序会很慢
用STL的 partial_sort
[解决办法]
这种帖子回了三四次了。
[解决办法]

C/C++ code
//这个应该比全部排序要快点#include <iostream>#include <list>#include <algorithm>using namespace std;#include <time.h>template <class T>void find_max(T* datas,size_t ds,list<T>& max,size_t ms){    size_t i;    for(i=0;i< ms;++i)    {        max.push_back(datas[i]);    }    max.sort( greater<T>());//降序       for ( i = ms; i < ds; ++i)// 20 19 18 16 15 10  8 7//    {        if(datas[i] < *max.begin())//算法效率的关键在,对小于这ms个数的数直接放弃            continue;          list<T>::iterator iter;    for(iter=max.begin();iter != max.end();++iter)            {            if(datas[i] > *iter)            {            max.insert(iter,datas[i]);            max.pop_back();            break;            }        }    }}int main(){    srand(time(0));//    const int size = 100;    float* datas = new float[size];    int i;    for ( i = 0; i < size; ++i)    {        datas[i] = (float)rand();        //cout<<datas[i]<<' ' ;    }    const int m=10;    float max[m] = {0.0};    //排序后输出最大的m个数,测试对比用.    //sort(&datas[0],&datas[size]);    //for ( i = size-1; i >=size-m; --i)    //{    //    cout<<datas[i]<<' ' ;    //}    //cout<<endl;        list<float> fmax;    find_max(datas,size,fmax,m);        for (list<float>::iterator iter=fmax.begin();iter!=fmax.end();++iter)        cout<<*iter<<" ";    cout<<endl;    delete[] datas;    return 0;}
[解决办法]
我有个猜想,请高手指正
利用快速排序中划分,m=1000
(1)一次划分结束后,可以得到一个大数划分和一个小数划分,并且划分元素所在的索引n表示它是第n大元素.
(2)若划分后n>>m,则再在大数划分中选择划分元素继续划分得到该划分中n个最大数,转(2)
(3)若划分后n<<m,则m=m-n再在小数划分中选择划分元素继续划分得到该划分中n个最大数,转(2)
(4)若n接近m,则只需要在现在划分下的大数或小数划分中找出|n-m|个大数,或去掉|n-m|个小数
(5)若n=m,则1000个最大数找出

其主要思想是尽可能不去处理较小的数,通过划分后,不断向目标大数划分逼近,且每次划分后的处理量减少,提高性能.

以上为个人猜想,请指教!
[解决办法]
这种类似问题可以出个专集了。。
。。用数论推个理论出来,大家按那标准做就最好了。
[解决办法]
to iambic: "楼上的你的partition很典型。但是请考虑下最坏情况。"
sliuyin的方法是在快排基础上的针对这道题一种改进,最坏情况也不过快排的
最坏情况啊.

我觉得他的方法还行.个人看法,请iambic指点.

[解决办法]
1:想把总的数据等分(等分多少分,看实际要求),每一分相当于一组
2:对等分后的每一组数据进行排序(降序)
3:然后在这些组中检最大的1000个数据
[解决办法]
肯定不能进行排序了,星羽那个改一下就是很快了,如果用list来实现的话,在挤出数据那里又会快一点

热点排行