横幅广告算法

时间:2011-01-24 20:08:09

标签: algorithm

我正在开发横幅广告系统。每个横幅都将存储在数据库中。每个横幅都有一个wight(int数字)。如何有效地改变百分比?

例如:

banner_1 70 banner_2 90 banner_3 150

我希望横幅1显示22% 第二个29% 第三个48%

6 个答案:

答案 0 :(得分:3)

如果权重为w[1]w[2],...,w[n],那么第i个横幅广告的p[i]百分比为:

p[i] = w[i] / sum(w)

即,给定广告的权重除以权重的总和。您的数据库系统应该能够相当容易地计算出来。

如果您的广告相对较少,并且广告获得的视图数量多于更新次数,则可能需要为每个广告缓存此p[i],然后在添加,删除或修改广告的权重时重新计算广告。

答案 1 :(得分:2)

这被称为(惊讶)“加权随机数”。 this question的最佳答案可以帮助您。

答案 2 :(得分:1)

假设您使用存储了权重的SQL数据库,您可以返回总权重并将其用于计算:

SELECT BannerId, BannerUrl, BannerWeight, SUM(BannerWeight) as TotalWeight FROM Banners;

然后使用类似的东西来找到一个值:

public int GetRandomRow(Row[] rows)
{
    int TotalWeight = 3;
    int rnd = Random(rows[0].TotalWeight);
    for (int row=0; row < rows.Count; row++)
    {
        if (rnd < rows[row])
            return row;
    }
}

答案 3 :(得分:0)

Banner1 = (70 / (70 + 90 + 150))  * 100 s
Banner2 = (90 / (70 + 90 + 150))  * 100 s
Banner3 = (150 / (70 + 90 + 150)) * 100 s

是的,这是一个简单的weighted average逻辑。

答案 4 :(得分:0)

如果您只需要权重转换百分比,那就非常简单:您需要对所有权重求和,然后对于每个权重,您将其除以总和并乘以100.它是O(n)。

答案 5 :(得分:0)

拳头关闭,你的百分比加起来达到99,所以我猜你已经四舍五入了。

要查找横幅x的百分比,您必须总结所有权重(找到100%),求解此等式:float percent = weight_x / sum of weights