均匀分布算法

时间:2015-08-05 20:15:10

标签: algorithm

我不是算法人员,所以这可能是一个非常简单的问题,我只是不知道要搜索的正确术语。此外,这个问题有一个人为的,不切实际的例子,但我认为我想要达到的目标是最清晰的。

假设一个网站的文章长度可以是任意数量的页面,并且有一组广告可以包含任意数量的广告。网站所有者有以下要求:

  1. 每篇广告应在整篇文章的页面中正好出现一次
  2. 广告应均匀分布在文章的页面
  3. 如果广告多于网页,则单个网页上的多个广告都可以
  4. 第1页必须始终至少有1个广告
  5. 因此,如果一篇文章有​​10个页面并且有5个广告,那么广告应该放在所有奇数页面上,而不是前5个页面有广告而后5个页面没有广告。

    我不知道如何应对更复杂的情况。例如,假设一篇文章有​​29页,有11个广告。由于要求#4,您将在第1页上看到广告,但是如何均匀分配其余广告?如果您在每个其他网页上都有广告,则第11个广告将显示在第21页上,这使得最后8个广告没有广告。如果您这样做,那么每个页面与广告之间只有2个页面没有广告,那么您将无法使用所有广告(要求#1)。所以你必须做一些事情,比如在每页和广告之间没有广告的1到2页之间交替。这样就可以使广告页面为1,3,6,8,11,13,16,18,21,23和26页。

    希望我想要实现的目标很明确。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

我添加了一个小提琴,可以实现这两种方式,从页码到页面中的广告,从广告到他们继续浏览的页面。你可以找到它HERE。您可以更改页数和广告数量,小提琴将以两种方式为您提供结果。请注意,广告是零索引的,因此第一个广告将是"添加0"。

您可以循环播放广告并将每个广告放在

for (int AdIndex = 0; AdIndex < NumberOfAds; AdIndex++) {
    PageNum = 1 + math.truncate( ((float) NumOfPages) * (float) AdIndex / (float) NumberOfAds);
}

如果你想反过来,在任何给定的页面上添加相关的广告,然后在该页面上,你会这样做:

for (adIndex=math.ceiling(((float) PageNum-1.0F)*(float)NumberOfAds / (float) NumberOfPages);
     adIndex<math.ceiling(((float) PageNum)*(float) NumberOfAds/(float) NumberOfPages);
     adIndex++)
{
    AddThisAdToCurrentPage(AdIndex);
}

这里的基本想法是,如果你想在P页面中放置N个广告,并且你想要均匀地分配它们,那么页面的差距就是P / N.除非P是N的倍数,否则这将给出一个带小数的数字。但是,这是秘密,您可以忽略这一事实并使用任何广告的浮点数学计算页码

page number = 1 + (ad number * P/N)

如果您确保数学全部使用浮点数完成,那么在获得该页码之前,然后,只有这样,将其向下舍入到下一个较低的整数,您将获得均匀分布的页码。可能。无论P是否小于或大于N,这都有效。

把这个等式转过来,你就得到了:

ad number = (page number - 1) * N/P

如果您再次进行浮点运算,然后在获得最终数字时将其向上舍入到下一个更高的整数,则会为您提供第一个应该在 上或之后出现的广告 此页面。除非您查看下一页的相同公式并找出应在下一页上或之后出现的第一个广告,否则这无济于事。如果是同一广告,则表示此页面上未发生广告。它发生在此页面之后。如果将公式应用到下一页为您提供更高版本的广告,那么我们知道此页面上有一些广告。或者以更简单的形式,我们循环将广告添加到此页面...

FROM (page number - 1) * N/P   TO  __less than__ (page number) * N/P

如果这两个数字相同,那么小于会导致没有广告被添加到当前页面。再次,用提供的小提琴检查出来。事实证明这是非常简单的代码。