高效采样方法

方法一:

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

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)时间。

时间: 2024-10-13 18:22:02

高效采样方法的相关文章

了解微软开源核心机器学习技术DMTK

还记得11月9日Google Research推出第二代开源机器学习软件库TensorFlow吧,谷歌称在建立和训练神经网络方面,TensorFlow速度要比第一代系统快5倍,可支持 CPU.GPU.桌面机.服务器和移动计算等平台.TensorFlow吸引了开发者广泛的眼球. 就在同一天,微软亚洲研究院也开源了分布式机器学习工具包DMTK.开源版DMTK包含了目前世界上最大规模的主题模型和分布式词向量模型,据称比同类模型高了好几个数量级.以至于有开发者惊呼,怎么微软也能把这样的核心技术给开源了?

Nginx为什么比Apache Httpd高效:原理篇

一.进程.线程? 进程是具有一定独立功能的,在计算机中已经运行的程序的实体.在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器.程序 本身只是指令.数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例.若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循 序)或异步(平行)的方式独立运行.现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借

如何使用Flexbox和CSS Grid,实现高效布局

CSS 浮动属性一直是网站上排列元素的主要方法之一,但是当实现复杂布局时,这种方法不总是那么理想.幸运的是,在现代网页设计时代,使用 Flexbox 和 CSS Grid 来对齐元素,变得相对容易起来. 使用 Flexbox 可以使元素对齐变得容易,因此 Flexbox 已经被广泛使用了. 同时,CSS Grid 布局也为网页设计行业带来了很大的便利.虽然 CSS Grid 布局未被广泛采用,但是浏览器逐渐开始增加对 CSS Grid 布局的支持. 虽然 Flexbox 和 CSS Grid 可

STM32F4XX高效驱动篇2 I2C

说到I2C很多用过STMF10X硬件I2C方式的工程师,都感觉有点头痛.大部分还是使用软件模拟的方式,I2C由于一般的工作频率是400,100KHz.所以在平凡读取,或所读数据量大时,使用这模拟的方式,还是比较浪费CPU有效工作时间的. 在之前的使用I2C的经历中,主要是I2C死锁问题让我也困扰了一段时间.不过后来经过多方资料,最后还是把这个问题解决了.以下驱动程序已集成了此功能. 什么是死锁,在I2C主设备进行读写操作的过程中.主设备在开始信号后控制SCL产生8个时钟脉冲,然后拉低SCL信号为

STM32F4XX高效驱动篇1-UART

之前一直在做驱动方面的整理工作,对驱动的高效性有一些自己的理解这里和大家分享一下.并奉驱动程序,本程序覆盖uart1-8. 串口驱动,这是在每个单片机中可以说是必备接口.可以说大部分产品中都会使用,更有甚者一个产品中用到8个串口.这样一个高效的驱动是决定您产品优劣的关键因素.本文主要针对STM32F4XX系列芯片做的一个驱动接口层.以减少您在开发项目时驱动方面所花费时间,以及为程序达到高效的处理为目的. 从51,pic到现在的STM32,个人感觉STM32这方面做的非常突出,丰富的使用模式,强大

构建高效可申缩的结果缓存

摘自<<JAVA并发编程实战>> public interface Computable<A, V> { V comput(A arg); } import java.util.concurrent.*; /** * 构建高效可申缩的结果缓存 * <p> * author: shiruiqiang * time: 31/01/2017 23:11 **/ public class Memoizer<A, V> implements Computa

老司机:如何让运维操作更轻松、高效

讲师介绍 庞辉富 广通软件技术总监 拥有10多年IT运维管理软件研发经验 致力于自动化运维解决方案的研究和推广 主导研发的产品广泛应用于海关.公安.能源等多个行业 技术发展给运维带来的挑战 当前的IT建设在这些新技术的演进下,我们看到的是呈现"双态IT"特征.Gartner也提出双模IT理论,与现在谈的双态IT是异曲同工的,不再是一种单纯的形态,而是两种形态交集在一起. 一种是稳态,也是我们经常说的核心业务,比如银行的核心业务.政府的核心业务等,业务系统一般以传统IOE或VCE架构设计

这些小工具让你的Android 开发更高效

在做Android 开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了,今天就为大家推荐一下Android 开发遇到的小工具,来让你的开发更高效. Vysor Vysor 是一个可以将手机的屏幕投影到电脑上,当然也可以操作,当我们做分享或者演示的时候,这个工具起到了作用. Vector Asset Android Studio 在1.4 支持了VectorAsset,所谓VectorAsset:它可以帮助你在Android 项目中添加Materia

高效的C指针

cnyinlinux 指针,被称做C语言编程的精华.其闻名数十年的秘诀在于,高效二字.今天我们讲的就是,指针是如何做到了这一切的. 经常你会看到这样的形式: XXX * func(int para1,-)://函数参数略 函数的返回值类型为指针,为何要返回一个指针呢? 指针在C中代表的是一片内存,也就意味着该函数返回时,将一片内存带给了原调函数(调用该函数的函数称为原调函数).这样做的目的是将函数处理结果存于内存,直接把存储地址返回.这样原调函数在获取结果的时候不必要再复制数据,直接在返回指针指