【问题标题】:Equally distribute array in pairs, combination/permutation question成对均匀分布数组,组合/排列问题
【发布时间】:2019-05-15 05:01:15
【问题描述】:

我正在尝试解决一个组合/排列问题,我有 10 个人,他们应该审查其他人的想法。每个人都应该准确地回顾 3 个想法,例如: 第 1 个人:评论 2、3、4 第 2 个人:评论 5,8, 9 第 3 个人:评论 9、10、1 ... 等等

限制是:

  1. 10是动态数,所以解也应该是动态的,我们称这个变量为m
  2. 3也是一个动态数字,所以这个解决方案应该也适用于其他数字,我们称这个变量为n
  3. 子数组的选择(谁审查谁)应该是随机的,如果相同的 10 个人进行 2 次不同的测试,他们不应该一遍又一遍地评估相同的人。

简而言之:在一组m 人中,每个人都应该准确评论n 人,同时收到n 评论。

我已经在ruby中找到了一些非常有用的方法,比如combination,基本上可以让我做这样的事情:

[1,2,3,4,5,6,7,8,9,10].combination(2).to_a
=> [[1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [1, 9], [1, 10], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [2, 9], [2, 10], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [3, 9], [3, 10], [4, 5], [4, 6], [4, 7], [4, 8], [4, 9], [4, 10], [5, 6], [5, 7], [5, 8], [5, 9], [5, 10], [6, 7], [6, 8], [6, 9], [6, 10], [7, 8], [7, 9], [7, 10], [8, 9], [8, 10], [9, 10]]

而且我还可以将它组合成 3 个(n)

irb(main):008:0> [1,2,3,4,5,6,7,8,9,10].combination(3).to_a
=> [[1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 2, 6], [1, 2, 7], [1, 2, 8], [1, 2, 9], [1, 2, 10], [1, 3, 4], [1, 3, 5], [1, 3, 6], [1, 3, 7], [1, 3, 8], [1, 3, 9], [1, 3, 10], [1, 4, 5], [1, 4, 6], [1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 4, 10], [1, 5, 6], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 5, 10], [1, 6, 7], [1, 6, 8], [1, 6, 9], [1, 6, 10], [1, 7, 8], [1, 7, 9], [1, 7, 10], [1, 8, 9], [1, 8, 10], [1, 9, 10], [2, 3, 4], [2, 3, 5], [2, 3, 6], [2, 3, 7], [2, 3, 8], [2, 3, 9], [2, 3, 10], [2, 4, 5], [2, 4, 6], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 4, 10], [2, 5, 6], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 5, 10], [2, 6, 7], [2, 6, 8], [2, 6, 9], [2, 6, 10], [2, 7, 8], [2, 7, 9], [2, 7, 10], [2, 8, 9], [2, 8, 10], [2, 9, 10], [3, 4, 5], [3, 4, 6], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 4, 10], [3, 5, 6], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 5, 10], [3, 6, 7], [3, 6, 8], [3, 6, 9], [3, 6, 10], [3, 7, 8], [3, 7, 9], [3, 7, 10], [3, 8, 9], [3, 8, 10], [3, 9, 10], [4, 5, 6], [4, 5, 7], [4, 5, 8], [4, 5, 9], [4, 5, 10], [4, 6, 7], [4, 6, 8], [4, 6, 9], [4, 6, 10], [4, 7, 8], [4, 7, 9], [4, 7, 10], [4, 8, 9], [4, 8, 10], [4, 9, 10], [5, 6, 7], [5, 6, 8], [5, 6, 9], [5, 6, 10], [5, 7, 8], [5, 7, 9], [5, 7, 10], [5, 8, 9], [5, 8, 10], [5, 9, 10], [6, 7, 8], [6, 7, 9], [6, 7, 10], [6, 8, 9], [6, 8, 10], [6, 9, 10], [7, 8, 9], [7, 8, 10], [7, 9, 10], [8, 9, 10]]

但是我不确定如何从这些子数组中挑选出确切的数量,以便每个人从m 人中收到n 评论。也许有一些我不熟悉的与这类问题相关的名称。

谢谢

【问题讨论】:

    标签: ruby combinations permutation


    【解决方案1】:

    给定 m 号构建“伙伴”数组:

    m = 10
    fellows = m.times.map{ |i| i }
    #=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    然后,每个人回顾接下来的三个:

    n = 3    
    reviews = fellows.map.with_index.with_object({}) { |(f, i), h| h[f] = fellows.rotate(i)[1..n] }
    #=> {0=>[1, 2, 3], 1=>[2, 3, 4], 2=>[3, 4, 5], 3=>[4, 5, 6], 4=>[5, 6, 7], 5=>[6, 7, 8], 6=>[7, 8, 9], 7=>[8, 9, 0], 8=>[9, 0, 1], 9=>[0, 1, 2]}
    

    可能需要随机化?

    reviews = fellows.shuffle!.map....
    

    【讨论】:

    • 简化为fellows = 0.upto(m -1); fellows.zip(fellows.cycle.each_cons(n)).to_h
    • 我认为您没有遗漏任何东西。我建议你删除你的第一句话。注意:fellows = (0..m-1).to_a.
    • @engineersmnky,谢谢。 cycle,我忘记了。我发布了我想出的第一个工作代码。另外,我认为它应该reviews = fellows.shuffle!.map....,砰!,才能正常工作
    • @iGian 都取决于期望的结果是什么shuffle! 将导致键和值被洗牌,而shuffle 将只导致键洗牌。我仍然不清楚所需的输出是什么
    • 这是一个很好的方法。起初,我不是 100% 确定只是旋转是否符合 m < n 的所有情况,从分类的角度来看它很容易理解。谢谢。
    猜你喜欢
    • 2017-06-28
    • 2014-12-29
    • 1970-01-01
    • 2016-12-16
    • 2020-01-15
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    相关资源
    最近更新 更多