编程语言
首页 > 编程语言> > c#-排序列表中的加权随机选择

c#-排序列表中的加权随机选择

作者:互联网

我有一个很大的项目列表,这些项目按“权重”排序.我需要能够从此列表中随机选择项目,但是更接近开始(较大权重)的项目必须有更大的机会根据“精英”因素进行选择.

我意识到以前也曾问过类似的问题,但这里的问题是此列表会随着时间的推移而变化.随着最后一项的删除,新值将被分类到列表中(以保持“优化”值池的大小不变).

首先,最有效的选择方法是什么?选择必须从50到1000项长的列表中实时进行.

其次,在这里使用的最佳数据结构是什么?我正在使用C#.

我只是想过一个可能的解决方案,但我希望对此想法有一些反馈.如果我要生成一个在一定范围内的随机浮点值,然后对它进行平方运算,该怎么办?较小的值将返回较小的值,较大的值将返回较大的值.据我所知,将此结果映射到列表的长度应该可以达到预期的效果.听起来对吗?

解决方法:

创建一个二叉树,按权重排序(除非在问题中指定,否则不需要排序),并为每个节点记录所有子级的总权重.在此顶部,我们可以计算整个列表的总重量.

选择一个介于零和所有事物总重量之间的随机值r.在每个节点上,如果当前节点的权重大于r,则这是您的结果.否则,从r中减去当前节点的权重.现在,如果所有剩余孩子的总体重小于r,则向左走.否则,从r中减去所有左子元素的总权重,然后右移.重复直到得到结果.

插入和删除成本取决于您选择实现和平衡树的方式,但是您还必须遍历所有祖先以更新其权重.

如果您实际上不需要对其进行排序,那么将其制成堆可能会改善快速行为.

标签:sortedlist,data-structures,random,c
来源: https://codeday.me/bug/20191028/1952335.html