алгоритм баннерной рекламы - PullRequest
0 голосов
/ 24 января 2011

Я занимаюсь разработкой системы баннерной рекламы. Каждый баннер будет храниться в БД. У каждого баннера будет свой вес (международный номер). Как я могу преобразовать это в процентах эффективно?

Например:

banner_1 70 banner_2 90 banner_3 150

и я хочу, чтобы баннер 1 отображался на 22% вторые 29% третий 48%

Ответы [ 6 ]

3 голосов
/ 24 января 2011

Если весами являются w[1], w[2], ..., w[n], то процент p[i] для i-го баннера будет:

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

То есть вес данного объявления, деленный на общую сумму весов. Ваша система баз данных должна быть в состоянии вычислить это довольно легко.

Если у вас относительно мало объявлений, и объявления получают гораздо больше просмотров, чем обновлений, возможно, стоит кэшировать этот p[i] для каждого объявления, а затем пересчитывать его при каждом добавлении, удалении или изменении веса объявления.

2 голосов
/ 24 января 2011

Это называется (неожиданно) "взвешенные случайные числа". Лучший ответ на этот вопрос должен помочь вам.

1 голос
/ 24 января 2011

Предполагая, что вы используете базу данных 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;
    }
}
0 голосов
/ 24 января 2011

Во-первых, ваши проценты в сумме составляют 99, так что я собираюсь угадать, что вы округлили несколько десятичных знаков.

Чтобы найти процентное содержание баннера x, необходимо сложить все веса (чтобы найти 100 процентов), решите это уравнение: float percent = weight_x / sum of weights

0 голосов
/ 24 января 2011

Если вам просто нужно преобразовать вес в процент, это действительно просто: вам нужно сложить все веса, а затем для каждого веса вы разделите его на сумму и умножите на 100. Это O (n).

0 голосов
/ 24 января 2011
Banner1 = (70 / (70 + 90 + 150))  * 100 s
Banner2 = (90 / (70 + 90 + 150))  * 100 s
Banner3 = (150 / (70 + 90 + 150)) * 100 s

Да, это простая средневзвешенная логика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...