用于删除

时间:2015-11-10 07:34:27

标签: algorithm probability

我正在寻找一种与alias method具有相似特征的加权随机选择算法,除非在选中项目后将其删除。

例如,我有一个包产生:

  • 70%的红色大理石。
  • 10%的绿色大理石。
  • 20%的蓝色大理石。

我对袋子进行取样并得到一块红色大理石。红色现在已被删除,所以我想现在这个包会产生:

  • 33%的绿色大理石。
  • 66%的蓝色大理石。

我相信你可以预先计算每个可能概率表的树,这样样本仍然是O(1)。是否有更聪明的算法用于恒定时间加权选择和删除?

1 个答案:

答案 0 :(得分:3)

实际上,我似乎误读了这个问题。我不知道别名方法,下面的答案不是类似的算法。我会在这里留下我的答案,因为它仍然提供了丰富的信息。

我不知道O(1)算法,但在log(N) 2 搜索和日志(N)更新中很容易做到。使用更具体的算法可以改善这一点。

将您的元素放在Fenwick tree中,并将其概率作为其值。此外,当更改元素时,记录总累积概率。

现在我们可以做的比仅仅删除元素更好!我们可以任意改变项目的概率,但是将项目的概率设置为0等同于删除它。然后可以在log(N)中查询 n 元素的累积概率。这在逻辑上扩展到第一个元素的log(N) 2 二进制搜索,其累积概率大于 p

现在,为了进行加权随机选择,我们在0和P之间生成一个数字 p ,其中P是总累积概率。然后我们进行上述二进制搜索,找到并选择累积概率大于 p 的第一个元素。

我对上述内容进行了改进,因为使用Fenwick树可以很容易地对第一个元素进行日志(N)搜索,累积概率大于或等于 p 。我强烈建议您阅读this explanation of Fenwick trees

简单地说,要找到元素,就像在任何其他树上一样在Fenwick树上进行常规二进制搜索,但保留当前累积总和(从0开始)除外。每当您在二进制搜索中选择右手子时,将当前累积和增加当前节点的值。然后,在将当前节点的值与我们要查找的累积和进行比较时,将当前节点的值添加到比较前的总和中。