zoukankan      html  css  js  c++  java
  • 蓄水池随机抽样检测

    一、蓄水池抽样

    收到一堆的数据包,数据包数量N很大,且N直到处理完所有数据之前都不可知,

    请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出m个不重复的数据?

    场景包含3个前提条件

    1、数据包数量N很大,不可知,所以不能直接在N个数据包中取随机数

    2、时间复杂度O(N),只能遍历一遍。

    3、随机选取m个数,每个数呗选中的概率为m/N,绝对随机

    C++代码实现如下:

    include<iostream>

    #include<time.h>

    using namespase std;

    void Reservoir(int *dataStream,int m,int N)

    {

      int *reservoir=new int[m];     //声明蓄水池

      for(int i=0;i<m ; i++ )       //初始化蓄水池

        reservoir[i]=dataStream[i];

      for(int i=m ; i<N ; i++)

      {

        srand((unsigned int)(time(0)));  

        int position=rand()%i;     //生成0~i之间的随机数

        if(position<m)        //如果随机数符合蓄水池范围,则替换掉蓄水池中的元素

          reservoir[position]=dataStream[i];

      }

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

        cout<<"蓄水池中第"<<i<<"个元素的小标为:"<<reservoir[i]<<endl;

    }

     void main()

    {

      int N=12;

      int m=4;

      int *array =new int[N];

      for(int i=0;i<N;i++)

        array[i]=i;

      Reservoir(array,m,N); 

    }

     算法思路:

    1)如果接受的数据量小于m,则依次存入蓄水池中

    2)当接收到第i个数据包时,i>=m,在[0, i]范围内取以随机数position,若position的落在[0, m-1]范围内,则用接收到的第i个数据替换蓄水池中的第position个数据。

    3)重复直至结束。

    二、分布式蓄水池抽样 

  • 相关阅读:
    从零开始学SQLSERVER-UNION
    从零开始学SQLSERVER-BETWEEN
    从零开始学SQLSERVER-LIKE
    从零开始学SQLSERVER-存储过程(基础用法)
    从零开始学SQLSERVER-TOP
    从零开始学SQLSERER-INNER JOIN
    从零开始学SQLSERVER-DELECT(删除)
    从零开始学SQLSERVER-ORDER BY(排序)
    从零开始学SQLSERVER-WHERE
    使用 C# 9 的records作为强类型ID
  • 原文地址:https://www.cnblogs.com/socks/p/11771651.html
Copyright © 2011-2022 走看看