码迷,mamicode.com
首页 > 其他好文 > 详细

高效采样方法

时间:2015-06-11 21:18:43      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:数组   数据结构   

技术分享方法一:

    在一个初始为空的集合中插入随机整数,直到填入足够的整数,伪代码如下:

initialize  set S to empty

size=0

while size<m do 

       t=bigrand()%n

      if t is not in S

           insert t into S

           size++

     print the elements of  S in sorted order

该算法在选择元素时能够保证所有的元素都具有相同的选中概率,它的输出是随机的。

技术分享技术分享

   利用C++标准模板库中现有的东西,并将集合称为set:

void gensets(int m,int n)

{

    set<int> S;

    while(S.size()<m)

            S.insert(bigrand()%n);

  set<int>::iterator i;

  for(i=S.begin();i!=S.end();++i)

       cout<<*i<<"\n";

}

C++标准模板库规范保证在O(logm)时间内完成每个插入操作,集合内部迭代需要O(m),所以整个程序需要的时间为O(mlogm)(和n相比,m较小时)。空间消耗较大。


技术分享方法二:

弄乱一个n个元素数组。这个数组包含数组的范围是0....n-1;然后排序前m个元素并输出。

     for i=[0,n)

         swap(i,randint(i,n-1))


2)) 只需要搅乱数组前m个元素,其C++程序:

      void genshuf(int m,int n)

      {

             int i,j;

            int *x=new int [n];

           for(i=0;i<n;i++)

                 x[i]=i;

           for(i=0;i<m;i++)

           {

                 j=randint(i,n-1);

                 int t=x[j];x[i]=x[j];x[j]=t;

           }

           sort(x,x+m);

           for(i=0;i<m;i++)

                 cout<<x[i]<<"\n";

      }

该算法使用了n个字的内存并需要O(n+mlogm)时间。


高效采样方法

标签:数组   数据结构   

原文地址:http://blog.csdn.net/wangfengfan1/article/details/46461413

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!