首页 > 解决方案 > 将数组划分为满足条件的相等大小的子集

问题描述

假设您有一个 2D 数组,其中包含 96 个唯一行,其中包含长度为 1 到 4 的数字列表d。例如:

[[1, 4, 2, 4, 1, 3, 1, 4, 1, 4, 4, 1, 3, 1, 4, 4],
 [2, 4, 2, 3, 2, 1, 3, 3, 3, 1, 1, 4, 1, 3, 3, 1],
 [4, 1, 4, 1, 3, 3, 2, 2, 4, 2, 2, 3, 2, 3, 1, 3],
 [3, 2, 3, 2, 4, 2, 4, 2, 1, 4, 4, 2, 3, 1, 3, 1]]
...
]

(整个阵列可以在这里访问:https ://drive.google.com/file/d/1sitNVmdQKhmJGerYHazPe9ygYQpUiMqY/view?usp=sharing )

任务是将这个数组分成 6 个子数组,每个子数组 shape (16, d)。唯一需要满足的条件是,在至少五个子数组中,每列需要至少出现两次数字 1、2、3 和 4。


我的(坏的)解决方案

  1. 我已经实现了一个随机选择子集并检查条件的算法。它适用于较小的数组,但如果d较大(例如 16 - 例如在我的情况下),它可能是一种非常无效的方法。
  2. 我还实现了一种贪心方法,首先考虑所有序列并循环遍历所有子数组的组合。如果找到满足条件的子数组,则保留该子数组并在其余部分上执行相同的操作,直到您有 5 个满足条件的子数组。

我真的不喜欢这两种实现,我相信有一种更优雅的方法。

标签: algorithmoptimization

解决方案


推荐阅读