迭代随机加权选择

时间:2013-07-21 18:12:46

标签: algorithm data-structures random

我正在试图找出一种方法,根据它们的权重迭代地从数组中选择随机值。我将使用here中的示例,但请注意我 - 这是一个稍微不同的问题。这是一个代表经纪人的类:

public class Broker
{
    public string Name = string.Empty;
    public int Weight = 0;

    public Broker(string n, int w)
    {
        this.Name = n;
        this.Weight = w;
    }
}

现在,我有一系列经纪人,我想随机选择一个经纪人,以便选择Broker a 的概率等于 a.Weight 除以数组中所有权重的总和。

此处的更改是我想要 n次,其中 n是数组的大小。所以我们可以在开始之前稍微使用数字(它不会比O(n)少)。 另请注意,权重与n 具有相同的数量级。

以下是我到目前为止所考虑的方向

  1. 构建一个大小为所有权重之和的数组,并将每个Broker a awewe 次放在数组中 - 然后随机化一个介于0和新数组大小之间的数字。这里的问题 - 如上所述,权重是O(n),因此这是一个O(n ^ 2)算法。
  2. 我找到了一种在O(nlog(n))中解决这个问题的方法(有些人可能认为是微不足道的)。我为每个经纪人分配权重的部分总和,从第一个和最后一个经纪人。然后我从0绘制一个数字到权重之和,并找到具有二分搜索的代理。我也可以用平衡的二叉搜索树实现这一点。
  3. 有没有人知道更好的(即O(n),甚至O(log(log(n))))解决方案?否则 - 任何人都可以证明我们不能比O(nlog(n))更快地完成它吗?

0 个答案:

没有答案