首页 / 知识
关于算法:从链表中有效选择一组随机元素
2023-04-14 19:52:00

Efficiently selecting a set of random elements from a linked list
假设我有一个长度为
如何最有效地编写一个从列表中返回 有一种非常好的,有效的算法,可以使用称为储层采样的方法。 首先,我向您介绍它的历史: Knuth在p上将此算法称为R。他的1997年版的Seminumerical Algorithms(计算机编程艺术的第2卷)第144页,并为此提供了一些代码。 Knuth将算法归因于Alan G. Waterman。尽管进行了冗长的搜索,但我仍然找不到Waterman的原始文档(如果存在),这也许就是为什么您经常看到引用Knuth作为该算法的来源的原因。 McLeod和Bellhouse,1983年(1)提供了比Knuth更为全面的讨论,以及该算法有效的第一个公开证明(据我所知)。 Vitter 1985(2)回顾了算法R,然后提出了另外三种算法,它们提供相同的输出,但又有所不同。他的算法不是选择包含还是跳过每个传入元素,而是预先确定要跳过的传入元素的数量。在他的测试中(现在已经过时了),这避免了随机数的产生和每个传入数字的比较,从而大大减少了执行时间。 用伪代码算法是:
请注意,我专门编写了代码,以避免指定输入的大小。那是该算法的一个很酷的特性:您可以运行它而无需事先知道输入的大小,并且它仍然可以确保您遇到的每个元素都有以 为什么这样做? McLeod和Bellhouse(1983)使用组合数学提供了证明。很漂亮,但是在这里重建它有点困难。因此,我生成了一个更容易解释的替代证明。 我们通过归纳证明进行。
假设我们要生成一组
假设我们当前的每个
根据算法的定义,我们选择概率为
已经成为结果集一部分的每个元素都有被替换的概率
因此,将
因此,
该算法的定义告诉我们,前 参考文献 McLeod,A。Ian和David R. Bellhouse。"一种用于绘制简单随机样本的便捷算法。"皇家统计学会杂志。系列C(应用统计)32.2(1983):182-184。 (链接) Vitter,JeffreyS。"使用水库进行随机采样。" ACM Transactions on Mathematical Software(TOMS)11.1(1985):37-57。 (链接) 这称为水库采样问题。一种简单的解决方案是为列表中的每个元素分配一个随机数,如您所见,然后按照随机数的顺序保留前(或后)k个元素。 我建议:首先找到您的k个随机数。对它们进行排序。然后遍历链接列表和您的随机数一次。 如果您不知道链表的长度(如何?),则可以将第一个k捕获到数组中,然后对于节点r,在[0,r)中生成一个随机数,如果小于大于k,请替换数组的第r个项目。 (不完全相信这不会产生偏见...) 除此之外:"如果我是你,我不会从这里开始。"您确定链接列表适合您的问题吗?是否没有更好的数据结构,例如好的旧式平面数组列表。
如果您不知道列表的长度,则必须遍历整个列表以确保随机选择。我在这种情况下使用的方法是Tom Hawtin(54070)描述的方法。在遍历列表时,您会保留
很容易证明这给出了一个随机选择。看到 你为什么不能做这样的事情
我确定您的意思不是那么简单,您可以进一步指定吗? 好吧,您确实至少需要知道N在运行时是什么,即使这涉及对列表进行额外的传递以对其进行计数。最简单的算法是从N中选择一个随机数并删除该项目,重复k次。或者,如果允许返回重复数字,请不要删除该项目。
除非您有一个非常大的N,并且对性能的要求非常严格,否则此算法必须以 编辑:没关系,汤姆·霍顿的方法更好。首先选择随机数,然后遍历列表一次。我认为理论上的复杂度相同,但预期的运行时要好得多。 |
最新内容
相关内容
linux重新链接库命令?
linux重新链接库命令?,代码,软件,平台,产品,电脑,系统,入口,市场,工业,通信,linux下金仓数据库重启命令1、进入开始菜单-金仓数据库KingbaseESlinux链接远程命令?
linux链接远程命令?,系统,地址,网络,密码,软件,名称,工具,服务,电脑,认证,如何远程连接linux服务器步骤一:登录Linux服务器。打开Xshell,新建会linux命令行链接网络?
linux命令行链接网络?,网络,系统,地址,工作,工具,最新,网址,数据,信息,环境,linux怎么配置网络连接Linux 系统中,可以通过以下几种方法配置网络linux动态链接库命令?
linux动态链接库命令?,代码,项目,工程,电脑,网上,文件,程序,静态,命令,目录,如何在linux下写动态链接库并卖给别人1、执行qmake main.pro生成mlinux取消链接命令行?
linux取消链接命令行?,工具,状态,环境,数据,命令,文件,终端,模式,指令,界面,linux怎么退出命令行1、先按ESC进入Command模式,然后输入“:wq”,回linux删除硬链接命令?
linux删除硬链接命令?,工作,数据,系统,信息,链接,命令,设备,名称,不了,概念,linux怎么备份删除bin下的.sh命令1、dump命令 Linux dump命令用于linux创建软链接命令?
linux创建软链接命令?,工作,地址,位置,系统,信息,管理,服务,名字,链接,文件,如何在linux下创建硬链接软链接首先要弄清楚,在Linux系统中,内核为linux中软链接命令?
linux中软链接命令?,位置,设备,数据,信息,系统,文件,链接,地址,对比,源文件,Linux中文件与目录对应的硬链接与软链接方式总结1、软链接可以理linux命令链接网页?
linux命令链接网页?,网络,信息,系统,网址,工具,网站,状态,发行,数据,命令,Linux下必须知道的11个网络命令netstat -r:打印路由表。路由表保存在linux软链接命令用法?
linux软链接命令用法?,时间,系统,位置,服务,链接,数据,地址,基础,不了,信息,Linux中文件与目录对应的硬链接与软链接方式总结1、软链接可以理linux目录链接命令?
linux目录链接命令?,系统,工作,时间,地址,数据,信息,管理,目录,文件,命令,请问linux中查看文件和目录的命令是什么1、ls命令。Is是List的缩写,linux命令创建硬链接?
linux命令创建硬链接?,数据,链接,系统,文件,位置,概念,不了,源文件,目录,命令,Linux中文件与目录对应的硬链接与软链接方式总结软链接可以理解