【问题标题】:Ordering a array of arrays in a 'fair' manner以“公平”的方式对数组进行排序
【发布时间】:2017-06-06 15:54:55
【问题描述】:

我有一个使用 N=9 创建的数组

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

我想一次取出N%2 的子数组,没有数字出现两次,例如第一次是:

[[1,2],[3,4],[5,6],[7,8]]

这意味着 9 未被选中。第二次我会拿出来

[[1,3],[2,4],[5,7],[6,8]]

9 又一次没有被选中。 最终我会留下

 [[1,9],[2,9],[3,9],[4,9],[5,9],[6, 9],[7, 9],[8, 9]]

这意味着我不能再选择没有重复数字的 4 个数组。

如何对我的数组进行排序,以便每个数字只漏掉一次,而不是一直漏掉 9 个?

用例如下:

students = [1,2,3,4,5,6,7,8,9]
available_combinations = a.combination(2).to_a

def make_pairs
 available_students = students
 while available_students.length > 1 do
  student_combination = find_sub_array(available_combinations, available_students.first, available_students)
   available_combinations.delete(student_combination)
   available_students -= student_combination
 end
end

 def find_sub_array(available_combinations, student, available_students)
 available_combinations.each do |subarray|
  if subarray.include?(student) && (subarray - available_students).empty?
    return subarray
  end
 end
end

我想多次运行 make_pairs,直到 available_combinations 不再有足够的对。

【问题讨论】:

  • “公平”是什么意思?你能举一个“公平订购”的例子吗?公平地说,您的要求是特定于 这个数组 的吗?因为我不知道您一般会期望看到什么行为。
  • 例如...如果您的(不寻常的)要求实际上是“我想获得 4 个元素对数组,没有重复”,那么您可以这样做:a.uniq.sample(8).each_slice(2).to_a
  • 我在我的问题中添加了更多信息,希望这样更清楚。
  • 请编辑您的问题以包含您目前编写的代码。
  • @Xizam 那就是所谓的“循环赛”锦标赛。维基百科给出了一些算法。

标签: arrays ruby sorting


【解决方案1】:

对于奇数,只需添加另一个虚拟数字,例如 0:bye

students = [1,2,3,4,5,6,7,8,9,:bye]

现在,当您提取 n%2 对时,至少有一对将与 :bye 配对。那是那对奇怪的学生。每个学生将有相同数量的 :bye 轮次。

编辑:我假设你在这个例子中拉了 5 对,并用 :bye 丢弃了这对,以确保它不会重复。

【讨论】:

  • 这不适用于当前系统。如果有 9 个学生和 1 个再见,算法将在第二次迭代中卡住,其中学生 9 和再见将连续第二次成为唯一剩下的人。
  • 在此示例中,您必须拉出 5 对并用 :bye 丢弃该对以使其正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-24
  • 2019-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
相关资源
最近更新 更多