Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用列表项逐渐冒泡执行加权洗牌的算法_Algorithm_Shuffle_Weighted - Fatal编程技术网

Algorithm 使用列表项逐渐冒泡执行加权洗牌的算法

Algorithm 使用列表项逐渐冒泡执行加权洗牌的算法,algorithm,shuffle,weighted,Algorithm,Shuffle,Weighted,我想知道是否有人知道一种简单的算法,可以对列表进行洗牌,从而允许权重偏差,从而使列表中的每个项目同时朝列表顶部移动 我在一个网站上工作,在分页目录中有企业列表,这些列表需要公平显示,这样一个企业就不能总是高于/低于另一个列表。单纯的目录洗牌实际上是不够的,因为这可能会导致任何给定的业务在很长一段时间内随机洗牌到列表中类似的位置,所以我想提供一些权重,这样每个列表都会慢慢地向上移动,这样随着时间的推移,它们在目录的第一页上显示的机会就相当平等了 编辑: 感谢凯文-我正试图将这些规则正式化: 1)

我想知道是否有人知道一种简单的算法,可以对列表进行洗牌,从而允许权重偏差,从而使列表中的每个项目同时朝列表顶部移动

我在一个网站上工作,在分页目录中有企业列表,这些列表需要公平显示,这样一个企业就不能总是高于/低于另一个列表。单纯的目录洗牌实际上是不够的,因为这可能会导致任何给定的业务在很长一段时间内随机洗牌到列表中类似的位置,所以我想提供一些权重,这样每个列表都会慢慢地向上移动,这样随着时间的推移,它们在目录的第一页上显示的机会就相当平等了

编辑:

感谢凯文-我正试图将这些规则正式化:

1) 对于n个列表,每个列表必须在n个“准随机”中显示一次

2) (模糊)列表的平均(?)位置应随时间增加,直到达到位置1

3) 对于任意两个业务(A和B),在n次洗牌迭代中,A在超过B的时间不得超过50%

我还要补充一点,我为一家企业工作,该企业有一个极其复杂和复杂的“洗牌者”,这是安抚大量付费客户所必需的,这些客户坚持在我们的目录中公平地分布在他们各自的业务类别中。来自客户的投诉是一个“真正”的问题,因为用户通常从前几页分页的页面中选择项目,所以按字母顺序(默认情况下)对客户进行排序是不公平的,而且鉴于用户从上到下阅读,一个业务总是高于另一个业务是不公平的

我很想知道是否有人有一个整洁的解决方案来解决这个问题,他们以前可能已经实施了

编辑:

我有一个想法,假设这些项目存储在数据库中,我可以有一个列,它是每个列表位置随时间变化的总和,我可以用它来排序(降序),当一个项目到达列表中的第一个位置时,我可以将其设置为0,这意味着列表中的每个项目最终都会到达列表的顶部。问题是,随着时间的推移,对于大量的列表,这个数字可能会变得相当大

编辑:


我不想猛击数据库,我需要在用户浏览时保持一致性,因此我只会每晚(每天一次)执行“伪洗牌”,而不是在目录的每个显示上执行“伪洗牌”

我想到的最简单答案是使用最近使用最少的(LRU)方法

更新顶部页面中显示的每个元素的时间戳,并呈现从“最近使用/显示的最新元素”到“最近使用/显示的最新元素”排序的所有元素

这应该可以做到,只需要更新首页中显示的元素的时间戳

随着新元素的添加,以及旧元素从列表中删除,这将保持项目的正常循环

您可以通过允许项目在返回到页面底部之前,在首页上重复几次来对此进行微调。这取决于数据库中的项目数、新元素的添加速率、旧元素的删除速率


我希望这能有所帮助,Laurent。

对于一个有X家公司的数据库,创建一个X X网格,并用公司名称填充每个单元格。任何给定的公司名称在每一行和每一列中都应该出现一次。例如,对于一个由十家公司组成的数据库,每个公司的名称只有一个字符,一个这样的网格如下所示:

ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
EFGHIJABCD
FGHIJABCDE
GHIJABCDEF
HIJABCDEFG
IJABCDEFGH
JABCDEFGHI
HIDEJBGCAF
IJEFACHDBG
JAFGBDIECH
ABGHCEJFDI
BCHIDFAGEJ
CDIJEGBHFA
DEJAFHCIGB
EFABGIDJHC
FGBCHJEAID
GHCDIAFBJE
第x行和第Y列中的公司将在第Y天从列表顶部显示x个单位。换句话说,您每天都会引用不同的行来排序公司名称。此方案满足两个标准:每个元素必须至少每X天在#1槽中一次,并且任何特定元素不应长时间停滞在同一位置。但仍然存在一个问题,即B公司总是出现在A公司之下,因此需要进行一些额外的工作

随机选择两列并交换它们。重复此过程,直到列充分随机化(请参阅,了解执行此操作的线性时间方法)。其中一个结果可能如下所示:

ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
EFGHIJABCD
FGHIJABCDE
GHIJABCDEF
HIJABCDEFG
IJABCDEFGH
JABCDEFGHI
HIDEJBGCAF
IJEFACHDBG
JAFGBDIECH
ABGHCEJFDI
BCHIDFAGEJ
CDIJEGBHFA
DEJAFHCIGB
EFABGIDJHC
FGBCHJEAID
GHCDIAFBJE
现在,平均有50%的时间A在B前面。实际百分比会有所不同,但它会以50%为中心呈钟形曲线下降,而且很少会达到非常不均衡的比例

B公司可能会抱怨,它总是在A公司出现在1号位置的第二天出现在1号位置。如果这是一个问题,那么也对行执行洗牌:

GCDHBIFEAJ
HDEICJGFBA
BHICGDAJFE
JFGAEBIHDC
IEFJDAHGCB
AGHBFCJIED
CIJDHEBAGF
EABFJGDCIH
FBCGAHEDJI
DJAEIFCBHG
现在您有了一个具有以下属性的订购方案:

专业人士

  • 在X天的周期中,所有X家公司都出现在#1时段
  • 在长达X天的周期中,没有一家公司会在同一时段停滞不前。一旦它占用了插槽K,它将不会在循环的其余部分返回到该插槽。(在最坏的情况下,它可能仍会在同一区域“徘徊”一段时间,但最终它会在列表中的任何地方出现)
  • 没有一家公司会在超过50%的时间里出现在另一家公司之上。你拥有的公司越多,它接近50%
  • 哪家公司将出现在#1位置是不可预测的,因此没有人可以根据公司被聚光灯照射的时间合理地声称存在偏见
缺点

  • 对于由N家公司组成的数据库,生成网格需要O(N^2)个时间和内存。您只需要每N天生成一个,并且可以提前完成,这样您就可以将成本分摊到O(N)个时间
  • 公司