我正在编写一个蒙特卡罗模拟,我必须在其中维护大量项目。此集合包含大量重复项,最好以记录重复项数量的数字形式存储其中的部分或全部,而不是单独存储每个。(这些项目本质上是字符串,因此它们具有不可忽略的内存成本。)
在每次迭代中,我从集合中删除一个随机项目,并可能添加一个或两个新项目。每个项目都有一个权重,从容器中抽样时,重要的是抽取给定项目的概率等于其权重乘以该类型项目的数量。
在每次迭代中添加的项目可能与容器中已经存在的项目重复,也可能不重复。这些项目可能大致呈 Pareto 分布,其中一些项目有大量重复项,而许多项目没有,但很难提前判断。
这似乎是一件相当普遍的事情,而且有效地做这件事似乎也不是一件容易的事。显而易见的方法是将项目存储在某种哈希表中,将每个项目与一个表示其频率的整数配对。问题是,从容器中采样不是很有效,因为您必须以基本上随机的顺序迭代项目。
另一方面,如果它们存储在平衡二叉树之类的东西中,那么采样将非常有效。然而,由于容器的内容在每次更新时都会发生变化,这将涉及一直重新平衡树,这(至少如果以一种天真的方式完成)将非常低效。
在我看来,我需要一个在采样速度和更新速度之间进行权衡的数据结构。也许是某种部分排序的堆状事物,当只有少数项目发生变化时,可以以较低的平均成本重新排序。但我不知道这样的结构。
如果有用于此目的的标准算法/数据结构,那么它叫什么?如果在 Python 和/或 C++ 中有现成的实现,那将是一个巨大的好处。
(请注意,用户thus spake a.k.在未加权的情况下对问题给出了优雅的答案,但我已经意识到对于我的应用程序来说,权重确实是必要的。)